aboutsummaryrefslogtreecommitdiff
path: root/lib/libhdhomerun/hdhomerun_pkt.h
diff options
context:
space:
mode:
authortheuni <theuni-nospam-@xbmc.org>2011-01-24 16:05:21 -0500
committertheuni <theuni-nospam-@xbmc.org>2011-01-24 16:05:21 -0500
commitc51b1189e3d5353e842991f5859ddcea0f73e426 (patch)
treeef2cb8a6184699aa614f3655dca4ce661cdc108e /lib/libhdhomerun/hdhomerun_pkt.h
parentbe61ebdc9e897fe40c6f371111724de79ddee8d5 (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.h177
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