Merged in antmerlino/apps/i8shark_fcs_suppresion (pull request #194)
i8shark: Adds support for intentionally suppressing passing the FCS so that Wireshark doesn't try to validate it. Approved-by: Gregory Nutt <gnutt@nuttx.org>
This commit is contained in:
parent
6228b43a72
commit
c68dd23509
@ -12,6 +12,14 @@ config IEEE802154_I8SHARK
|
|||||||
|
|
||||||
if IEEE802154_I8SHARK
|
if IEEE802154_I8SHARK
|
||||||
|
|
||||||
|
config IEEE802154_I8SHARK_DAEMON_PRIORITY
|
||||||
|
int "i8shark task priority"
|
||||||
|
default 100
|
||||||
|
|
||||||
|
config IEEE802154_I8SHARK_DAEMON_STACKSIZE
|
||||||
|
int "i8shark stack size"
|
||||||
|
default 2048
|
||||||
|
|
||||||
config IEEE802154_I8SHARK_DEVPATH
|
config IEEE802154_I8SHARK_DEVPATH
|
||||||
string "MAC char driver path"
|
string "MAC char driver path"
|
||||||
default "/dev/ieee0"
|
default "/dev/ieee0"
|
||||||
@ -22,6 +30,17 @@ config IEEE802154_I8SHARK_HOST_IPADDR
|
|||||||
hex "Host IP address where Wireshark is running"
|
hex "Host IP address where Wireshark is running"
|
||||||
default 0x0a000001
|
default 0x0a000001
|
||||||
|
|
||||||
|
config IEEE802154_I8SHARK_SUPPRESS_FCS
|
||||||
|
bool "Suppress passing FCS to Wireshark"
|
||||||
|
default n
|
||||||
|
---help---
|
||||||
|
The current Wireshark disector does not continue processing a frame, aka
|
||||||
|
6LoWPAN processing, if the FCS is incorrect. Furthermore, the FCS length
|
||||||
|
in the disector is hard-coded to be 2 bytes. Some PHY implement different
|
||||||
|
length FCS. However, Wireshark will ignore the FCS checking if an FCS is
|
||||||
|
not provided. This option intentionally excludes the last n bytes of the
|
||||||
|
frame where n is the FCS length of the current radio settings.
|
||||||
|
|
||||||
config IEEE802154_I8SHARK_XBEE_APPHDR
|
config IEEE802154_I8SHARK_XBEE_APPHDR
|
||||||
bool "XBee App Header compensation"
|
bool "XBee App Header compensation"
|
||||||
default n
|
default n
|
||||||
|
@ -104,7 +104,6 @@ struct i8shark_state_s
|
|||||||
|
|
||||||
/* User exposed settings */
|
/* User exposed settings */
|
||||||
|
|
||||||
uint8_t chan;
|
|
||||||
FAR char devpath[I8SHARK_MAX_DEVPATH];
|
FAR char devpath[I8SHARK_MAX_DEVPATH];
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -229,7 +228,6 @@ static int i8shark_init(FAR struct i8shark_state_s *i8shark)
|
|||||||
|
|
||||||
/* Set the default settings using config options */
|
/* Set the default settings using config options */
|
||||||
|
|
||||||
i8shark->chan = CONFIG_IEEE802154_I8SHARK_CHANNEL;
|
|
||||||
strcpy(i8shark->devpath, CONFIG_IEEE802154_I8SHARK_DEVPATH);
|
strcpy(i8shark->devpath, CONFIG_IEEE802154_I8SHARK_DEVPATH);
|
||||||
|
|
||||||
/* Flags for synchronzing with daemon state */
|
/* Flags for synchronzing with daemon state */
|
||||||
@ -323,7 +321,7 @@ static int i8shark_daemon(int argc, FAR char *argv[])
|
|||||||
enum ieee802154_frametype_e ftype;
|
enum ieee802154_frametype_e ftype;
|
||||||
uint8_t zepframe[I8SHARK_MAX_ZEPFRAME];
|
uint8_t zepframe[I8SHARK_MAX_ZEPFRAME];
|
||||||
clock_t systime;
|
clock_t systime;
|
||||||
int ind = 0;
|
int i = 0;
|
||||||
int nbytes;
|
int nbytes;
|
||||||
|
|
||||||
/* Get an incoming frame from the MAC character driver */
|
/* Get an incoming frame from the MAC character driver */
|
||||||
@ -336,12 +334,12 @@ static int i8shark_daemon(int argc, FAR char *argv[])
|
|||||||
|
|
||||||
/* First 2 bytes of packet represent preamble. For ZEP, "EX" */
|
/* First 2 bytes of packet represent preamble. For ZEP, "EX" */
|
||||||
|
|
||||||
zepframe[ind++] = 'E';
|
zepframe[i++] = 'E';
|
||||||
zepframe[ind++] = 'X';
|
zepframe[i++] = 'X';
|
||||||
|
|
||||||
/* The next byte is the version. We are using V2 */
|
/* The next byte is the version. We are using V2 */
|
||||||
|
|
||||||
zepframe[ind++] = 2;
|
zepframe[i++] = 2;
|
||||||
|
|
||||||
/* Next byte is type. ZEP only differentiates between ACK and Data. My
|
/* Next byte is type. ZEP only differentiates between ACK and Data. My
|
||||||
* assumption is that Data also includes MAC command frames and beacon
|
* assumption is that Data also includes MAC command frames and beacon
|
||||||
@ -353,27 +351,27 @@ static int i8shark_daemon(int argc, FAR char *argv[])
|
|||||||
|
|
||||||
if (ftype == IEEE802154_FRAME_ACK)
|
if (ftype == IEEE802154_FRAME_ACK)
|
||||||
{
|
{
|
||||||
zepframe[ind++] = 2;
|
zepframe[i++] = 2;
|
||||||
|
|
||||||
/* Not sure why, but the ZEP header allows for a 4-byte sequence no.
|
/* Not sure why, but the ZEP header allows for a 4-byte sequence no.
|
||||||
* despite 802.15.4 sequence number only being 1-byte
|
* despite 802.15.4 sequence number only being 1-byte
|
||||||
*/
|
*/
|
||||||
|
|
||||||
zepframe[ind] = frame.meta.dsn;
|
zepframe[i] = frame.meta.dsn;
|
||||||
ind += 4;
|
i += 4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
zepframe[ind++] = 1;
|
zepframe[i++] = 1;
|
||||||
|
|
||||||
/* Next bytes is the Channel ID */
|
/* Next bytes is the Channel ID */
|
||||||
|
|
||||||
ieee802154_getchan(fd, &zepframe[ind++]);
|
ieee802154_getchan(fd, &zepframe[i++]);
|
||||||
|
|
||||||
/* For now, just hard code the device ID to an arbitrary value */
|
/* For now, just hard code the device ID to an arbitrary value */
|
||||||
|
|
||||||
zepframe[ind++] = 0xFA;
|
zepframe[i++] = 0xFA;
|
||||||
zepframe[ind++] = 0xDE;
|
zepframe[i++] = 0xDE;
|
||||||
|
|
||||||
/* Not completely sure what LQI mode is. My best guess as of now based
|
/* Not completely sure what LQI mode is. My best guess as of now based
|
||||||
* on a few comments in the Wireshark code is that it determines whether
|
* on a few comments in the Wireshark code is that it determines whether
|
||||||
@ -383,46 +381,46 @@ static int i8shark_daemon(int argc, FAR char *argv[])
|
|||||||
* may be a bad assumption for certain radios.
|
* may be a bad assumption for certain radios.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
zepframe[ind++] = 1;
|
zepframe[i++] = 1;
|
||||||
|
|
||||||
/* Next byte is the LQI value */
|
/* Next byte is the LQI value */
|
||||||
|
|
||||||
zepframe[ind++] = frame.meta.lqi;
|
zepframe[i++] = frame.meta.lqi;
|
||||||
|
|
||||||
/* Need to use NTP to get time, but for now, include the system time */
|
/* Need to use NTP to get time, but for now, include the system time */
|
||||||
|
|
||||||
systime = clock();
|
systime = clock();
|
||||||
memcpy(&zepframe[ind], &systime, 8);
|
memcpy(&zepframe[i], &systime, 8);
|
||||||
ind += 8;
|
i += 8;
|
||||||
|
|
||||||
/* Not sure why, but the ZEP header allows for a 4-byte sequence no.
|
/* Not sure why, but the ZEP header allows for a 4-byte sequence no.
|
||||||
* despite 802.15.4 sequence number only being 1-byte
|
* despite 802.15.4 sequence number only being 1-byte
|
||||||
*/
|
*/
|
||||||
|
|
||||||
zepframe[ind] = frame.meta.dsn;
|
zepframe[i] = frame.meta.dsn;
|
||||||
zepframe[ind+1] = 0;
|
zepframe[i+1] = 0;
|
||||||
zepframe[ind+2] = 0;
|
zepframe[i+2] = 0;
|
||||||
zepframe[ind+3] = 0;
|
zepframe[i+3] = 0;
|
||||||
ind += 4;
|
i += 4;
|
||||||
|
|
||||||
/* Skip 10-bytes for reserved fields */
|
/* Skip 10-bytes for reserved fields */
|
||||||
|
|
||||||
ind += 10;
|
i += 10;
|
||||||
|
|
||||||
/* Last byte is the length */
|
/* Last byte is the length */
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE802154_I8SHARK_XBEE_APPHDR
|
#ifdef CONFIG_IEEE802154_I8SHARK_XBEE_APPHDR
|
||||||
zepframe[ind++] = frame.length - 2;
|
zepframe[i++] = frame.length - 2;
|
||||||
#else
|
#else
|
||||||
zepframe[ind++] = frame.length;
|
zepframe[i++] = frame.length;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The ZEP header is filled, now copy the frame in */
|
/* The ZEP header is filled, now copy the frame in */
|
||||||
|
|
||||||
#ifdef CONFIG_IEEE802154_I8SHARK_XBEE_APPHDR
|
#ifdef CONFIG_IEEE802154_I8SHARK_XBEE_APPHDR
|
||||||
memcpy(&zepframe[ind], frame.payload, frame.offset);
|
memcpy(&zepframe[i], frame.payload, frame.offset);
|
||||||
ind += frame.offset;
|
i += frame.offset;
|
||||||
|
|
||||||
/* XBee radios use a 2 byte "application header" to support duplicate packet
|
/* XBee radios use a 2 byte "application header" to support duplicate packet
|
||||||
* detection. Wireshark doesn't know how to handle this data, so we provide
|
* detection. Wireshark doesn't know how to handle this data, so we provide
|
||||||
@ -436,18 +434,30 @@ static int i8shark_daemon(int argc, FAR char *argv[])
|
|||||||
* will not fail.
|
* will not fail.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memcpy(&zepframe[ind], (frame.payload + frame.offset + 2),
|
memcpy(&zepframe[i], (frame.payload + frame.offset + 2),
|
||||||
(frame.length - frame.offset - 2));
|
(frame.length - frame.offset - 2));
|
||||||
ind += frame.length - frame.offset - 4;
|
i += frame.length - frame.offset - 4;
|
||||||
#else
|
#else
|
||||||
memcpy(&zepframe[ind], frame.payload, frame.length);
|
/* If FCS suppression is enabled, subtract the FCS length to reduce the
|
||||||
ind += frame.length;
|
* piece of the frame copied.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef CONFIG_IEEE802154_I8SHARK_SUPPRESS_FCS
|
||||||
|
{
|
||||||
|
uint8_t fcslen;
|
||||||
|
ieee802154_getfcslen(fd, &fcslen);
|
||||||
|
frame.length -= fcslen;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
memcpy(&zepframe[i], frame.payload, frame.length);
|
||||||
|
i += frame.length;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Send the encapsulated frame to Wireshark over UDP */
|
/* Send the encapsulated frame to Wireshark over UDP */
|
||||||
|
|
||||||
nbytes = sendto(sockfd, zepframe, ind, 0, (struct sockaddr*)&raddr, addrlen);
|
nbytes = sendto(sockfd, zepframe, i, 0, (struct sockaddr*)&raddr, addrlen);
|
||||||
if (nbytes < ind)
|
if (nbytes < i)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "ERROR: sendto() did not send all bytes. %d\n", errno);
|
fprintf(stderr, "ERROR: sendto() did not send all bytes. %d\n", errno);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user