diff options
author | theuni <theuni-nospam-@xbmc.org> | 2011-01-24 16:05:21 -0500 |
---|---|---|
committer | theuni <theuni-nospam-@xbmc.org> | 2011-01-24 16:05:21 -0500 |
commit | c51b1189e3d5353e842991f5859ddcea0f73e426 (patch) | |
tree | ef2cb8a6184699aa614f3655dca4ce661cdc108e /lib/libhdhomerun/hdhomerun_pkt.h | |
parent | be61ebdc9e897fe40c6f371111724de79ddee8d5 (diff) |
Merged cptspiff's code-reshuffle branch.
Squashed commit due to build breakage during code-reshuffle history.
Conflicts:
xbmc/Util.cpp
xbmc/cdrip/CDDARipper.cpp
xbmc/filesystem/Directory.cpp
xbmc/filesystem/File.cpp
Diffstat (limited to 'lib/libhdhomerun/hdhomerun_pkt.h')
-rw-r--r-- | lib/libhdhomerun/hdhomerun_pkt.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/lib/libhdhomerun/hdhomerun_pkt.h b/lib/libhdhomerun/hdhomerun_pkt.h new file mode 100644 index 0000000000..636a784f09 --- /dev/null +++ b/lib/libhdhomerun/hdhomerun_pkt.h @@ -0,0 +1,177 @@ +/* + * hdhomerun_pkt.h + * + * Copyright © 2005-2006 Silicondust Engineering Ltd. <www.silicondust.com>. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception to the GNU Lesser General Public License, + * you may link, statically or dynamically, an application with a + * publicly distributed version of the Library to produce an + * executable file containing portions of the Library, and + * distribute that executable file under terms of your choice, + * without any of the additional requirements listed in clause 4 of + * the GNU Lesser General Public License. + * + * By "a publicly distributed version of the Library", we mean + * either the unmodified Library as distributed by Silicondust, or a + * modified version of the Library that is distributed under the + * conditions defined in the GNU Lesser General Public License. + */ +#ifdef __cplusplus +extern "C" { +#endif + +/* + * The discover protocol (UDP port 65001) and control protocol (TCP port 65001) + * both use the same packet based format: + * uint16_t Packet type + * uint16_t Payload length (bytes) + * uint8_t[] Payload data (0-n bytes). + * uint32_t CRC (Ethernet style 32-bit CRC) + * + * All variables are big-endian except for the crc which is little-endian. + * + * Valid values for the packet type are listed below as defines prefixed + * with "HDHOMERUN_TYPE_" + * + * Discovery: + * + * The payload for a discovery request or reply is a simple sequence of + * tag-length-value data: + * uint8_t Tag + * varlen Length + * uint8_t[] Value (0-n bytes) + * + * The length field can be one or two bytes long. + * For a length <= 127 bytes the length is expressed as a single byte. The + * most-significant-bit is clear indicating a single-byte length. + * For a length >= 128 bytes the length is expressed as a sequence of two bytes as follows: + * The first byte is contains the least-significant 7-bits of the length. The + * most-significant bit is then set (add 0x80) to indicate that it is a two byte length. + * The second byte contains the length shifted down 7 bits. + * + * A discovery request packet has a packet type of HDHOMERUN_TYPE_DISCOVER_REQ and should + * contain two tags: HDHOMERUN_TAG_DEVICE_TYPE and HDHOMERUN_TAG_DEVICE_ID. + * The HDHOMERUN_TAG_DEVICE_TYPE value should be set to HDHOMERUN_DEVICE_TYPE_TUNER. + * The HDHOMERUN_TAG_DEVICE_ID value should be set to HDHOMERUN_DEVICE_ID_WILDCARD to match + * all devices, or to the 32-bit device id number to match a single device. + * + * The discovery response packet has a packet type of HDHOMERUN_TYPE_DISCOVER_RPY and has the + * same format as the discovery request packet with the two tags: HDHOMERUN_TAG_DEVICE_TYPE and + * HDHOMERUN_TAG_DEVICE_ID. In the future additional tags may also be returned - unknown tags + * should be skipped and not treated as an error. + * + * Control get/set: + * + * The payload for a control get/set request is a simple sequence of tag-length-value data + * following the same format as for discover packets. + * + * A get request packet has a packet type of HDHOMERUN_TYPE_GETSET_REQ and should contain + * the tag: HDHOMERUN_TAG_GETSET_NAME. The HDHOMERUN_TAG_GETSET_NAME value should be a sequence + * of bytes forming a null-terminated string, including the NULL. The TLV length must include + * the NULL character so the length field should be set to strlen(str) + 1. + * + * A set request packet has a packet type of HDHOMERUN_TYPE_GETSET_REQ (same as a get request) + * and should contain two tags: HDHOMERUN_TAG_GETSET_NAME and HDHOMERUN_TAG_GETSET_VALUE. + * The HDHOMERUN_TAG_GETSET_NAME value should be a sequence of bytes forming a null-terminated + * string, including the NULL. + * The HDHOMERUN_TAG_GETSET_VALUE value should be a sequence of bytes forming a null-terminated + * string, including the NULL. + * + * The get and set reply packets have the packet type HDHOMERUN_TYPE_GETSET_RPY and have the same + * format as the set request packet with the two tags: HDHOMERUN_TAG_GETSET_NAME and + * HDHOMERUN_TAG_GETSET_VALUE. A set request is also implicit get request so the updated value is + * returned. + * + * If the device encounters an error handling the get or set request then the get/set reply packet + * will contain the tag HDHOMERUN_TAG_ERROR_MESSAGE. The format of the value is a sequence of + * bytes forming a null-terminated string, including the NULL. + * + * In the future additional tags may also be returned - unknown tags should be skipped and not + * treated as an error. + * + * Security note: The application should not rely on the NULL character being present. The + * application should write a NULL character based on the TLV length to protect the application + * from a potential attack. + * + * Firmware Upgrade: + * + * A firmware upgrade packet has a packet type of HDHOMERUN_TYPE_UPGRADE_REQ and has a fixed format: + * uint32_t Position in bytes from start of file. + * uint8_t[256] Firmware data (256 bytes) + * + * The data must be uploaded in 256 byte chunks and must be uploaded in order. + * The position number is in bytes so will increment by 256 each time. + * + * When all data is uploaded it should be signaled complete by sending another packet of type + * HDHOMERUN_TYPE_UPGRADE_REQ with payload of a single uint32_t with the value 0xFFFFFFFF. + */ + +#define HDHOMERUN_DISCOVER_UDP_PORT 65001 +#define HDHOMERUN_CONTROL_TCP_PORT 65001 + +#define HDHOMERUN_MAX_PACKET_SIZE 1460 +#define HDHOMERUN_MAX_PAYLOAD_SIZE 1452 + +#define HDHOMERUN_TYPE_DISCOVER_REQ 0x0002 +#define HDHOMERUN_TYPE_DISCOVER_RPY 0x0003 +#define HDHOMERUN_TYPE_GETSET_REQ 0x0004 +#define HDHOMERUN_TYPE_GETSET_RPY 0x0005 +#define HDHOMERUN_TYPE_UPGRADE_REQ 0x0006 +#define HDHOMERUN_TYPE_UPGRADE_RPY 0x0007 + +#define HDHOMERUN_TAG_DEVICE_TYPE 0x01 +#define HDHOMERUN_TAG_DEVICE_ID 0x02 +#define HDHOMERUN_TAG_GETSET_NAME 0x03 +#define HDHOMERUN_TAG_GETSET_VALUE 0x04 +#define HDHOMERUN_TAG_GETSET_LOCKKEY 0x15 +#define HDHOMERUN_TAG_ERROR_MESSAGE 0x05 + +#define HDHOMERUN_DEVICE_TYPE_WILDCARD 0xFFFFFFFF +#define HDHOMERUN_DEVICE_TYPE_TUNER 0x00000001 +#define HDHOMERUN_DEVICE_ID_WILDCARD 0xFFFFFFFF + +#define HDHOMERUN_MIN_PEEK_LENGTH 4 + +struct hdhomerun_pkt_t { + uint8_t *pos; + uint8_t *start; + uint8_t *end; + uint8_t *limit; + uint8_t buffer[3074]; +}; + +extern LIBTYPE struct hdhomerun_pkt_t *hdhomerun_pkt_create(void); +extern LIBTYPE void hdhomerun_pkt_destroy(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE void hdhomerun_pkt_reset(struct hdhomerun_pkt_t *pkt); + +extern LIBTYPE uint8_t hdhomerun_pkt_read_u8(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE uint16_t hdhomerun_pkt_read_u16(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE uint32_t hdhomerun_pkt_read_u32(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE size_t hdhomerun_pkt_read_var_length(struct hdhomerun_pkt_t *pkt); +extern LIBTYPE uint8_t *hdhomerun_pkt_read_tlv(struct hdhomerun_pkt_t *pkt, uint8_t *ptag, size_t *plength); + +extern LIBTYPE void hdhomerun_pkt_write_u8(struct hdhomerun_pkt_t *pkt, uint8_t v); +extern LIBTYPE void hdhomerun_pkt_write_u16(struct hdhomerun_pkt_t *pkt, uint16_t v); +extern LIBTYPE void hdhomerun_pkt_write_u32(struct hdhomerun_pkt_t *pkt, uint32_t v); +extern LIBTYPE void hdhomerun_pkt_write_var_length(struct hdhomerun_pkt_t *pkt, size_t v); +extern LIBTYPE void hdhomerun_pkt_write_mem(struct hdhomerun_pkt_t *pkt, const void *mem, size_t length); + +extern LIBTYPE bool_t hdhomerun_pkt_open_frame(struct hdhomerun_pkt_t *pkt, uint16_t *ptype); +extern LIBTYPE void hdhomerun_pkt_seal_frame(struct hdhomerun_pkt_t *pkt, uint16_t frame_type); + +#ifdef __cplusplus +} +#endif |