aboutsummaryrefslogtreecommitdiffstats
path: root/src/drivers/net/iphone.h
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-12-16 13:29:06 +0000
committerMichael Brown <mcb30@ipxe.org>2020-12-16 13:29:06 +0000
commitf47a45ea2d4ff0f7b725e0c069948c81ef8b67a1 (patch)
tree83a29da72c6e3eee39d291919d6f9149f05af8e1 /src/drivers/net/iphone.h
parentf43a8f8b9f808fb0a8347663abf6efe6908821ed (diff)
downloadipxe-f47a45ea2d4ff0f7b725e0c069948c81ef8b67a1.tar.gz
[iphone] Add iPhone tethering driver
USB tethering via an iPhone is unreasonably complicated due to the requirement to perform a pairing operation that involves establishing a TLS session over a completely unrelated USB function that speaks a protocol that is almost, but not quite, entirely unlike TCP. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net/iphone.h')
-rw-r--r--src/drivers/net/iphone.h291
1 files changed, 291 insertions, 0 deletions
diff --git a/src/drivers/net/iphone.h b/src/drivers/net/iphone.h
new file mode 100644
index 000000000..2db6da7bd
--- /dev/null
+++ b/src/drivers/net/iphone.h
@@ -0,0 +1,291 @@
+#ifndef _IPHONE_H
+#define _IPHONE_H
+
+/** @file
+ *
+ * iPhone USB Ethernet driver
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/usb.h>
+#include <ipxe/usbnet.h>
+#include <ipxe/process.h>
+#include <ipxe/timer.h>
+#include <ipxe/retry.h>
+#include <ipxe/tcp.h>
+#include <ipxe/x509.h>
+#include <ipxe/privkey.h>
+
+/******************************************************************************
+ *
+ * iPhone pairing certificates
+ *
+ ******************************************************************************
+ */
+
+/** An iPhone pairing certificate set */
+struct icert {
+ /** "Private" key */
+ struct private_key *key;
+ /** Root certificate */
+ struct x509_certificate *root;
+ /** Host certificate */
+ struct x509_certificate *host;
+ /** Device certificate */
+ struct x509_certificate *device;
+};
+
+/******************************************************************************
+ *
+ * iPhone USB multiplexer
+ *
+ ******************************************************************************
+ */
+
+/** An iPhone USB multiplexed packet header */
+struct imux_header {
+ /** Protocol */
+ uint32_t protocol;
+ /** Length (including this header) */
+ uint32_t len;
+ /** Reserved */
+ uint32_t reserved;
+ /** Output sequence number */
+ uint16_t out_seq;
+ /** Input sequence number */
+ uint16_t in_seq;
+} __attribute__ (( packed ));
+
+/** iPhone USB multiplexer protocols */
+enum imux_protocol {
+ /** Version number */
+ IMUX_VERSION = 0,
+ /** Log message */
+ IMUX_LOG = 1,
+ /** TCP packet */
+ IMUX_TCP = IP_TCP,
+};
+
+/** An iPhone USB multiplexed version message header */
+struct imux_header_version {
+ /** Multiplexed packet header */
+ struct imux_header hdr;
+ /** Reserved */
+ uint32_t reserved;
+} __attribute__ (( packed ));
+
+/** An iPhone USB multiplexed log message header */
+struct imux_header_log {
+ /** Multiplexed packet header */
+ struct imux_header hdr;
+ /** Log level */
+ uint8_t level;
+ /** Message */
+ char msg[0];
+} __attribute__ (( packed ));
+
+/** An iPhone USB multiplexed pseudo-TCP message header */
+struct imux_header_tcp {
+ /** Multiplexed packet header */
+ struct imux_header hdr;
+ /** Pseudo-TCP header */
+ struct tcp_header tcp;
+} __attribute__ (( packed ));
+
+/** Local port number
+ *
+ * This is a policy decision.
+ */
+#define IMUX_PORT_LOCAL 0x18ae
+
+/** Lockdown daemon port number */
+#define IMUX_PORT_LOCKDOWND 62078
+
+/** Advertised TCP window
+ *
+ * This is a policy decision.
+ */
+#define IMUX_WINDOW 0x0200
+
+/** An iPhone USB multiplexer */
+struct imux {
+ /** Reference counter */
+ struct refcnt refcnt;
+ /** USB device */
+ struct usb_device *usb;
+ /** USB bus */
+ struct usb_bus *bus;
+ /** USB network device */
+ struct usbnet_device usbnet;
+ /** List of USB multiplexers */
+ struct list_head list;
+
+ /** Polling process */
+ struct process process;
+ /** Pending action
+ *
+ * @v imux USB multiplexer
+ * @ret rc Return status code
+ */
+ int ( * action ) ( struct imux *imux );
+
+ /** Input sequence */
+ uint16_t in_seq;
+ /** Output sequence */
+ uint16_t out_seq;
+ /** Pseudo-TCP sequence number */
+ uint32_t tcp_seq;
+ /** Pseudo-TCP acknowledgement number */
+ uint32_t tcp_ack;
+ /** Pseudo-TCP local port number */
+ uint16_t port;
+
+ /** Pseudo-TCP lockdown socket interface */
+ struct interface tcp;
+ /** Pairing flags */
+ unsigned int flags;
+ /** Pairing status */
+ int rc;
+};
+
+/** Multiplexer bulk IN maximum fill level
+ *
+ * This is a policy decision.
+ */
+#define IMUX_IN_MAX_FILL 1
+
+/** Multiplexer bulk IN buffer size
+ *
+ * This is a policy decision.
+ */
+#define IMUX_IN_MTU 4096
+
+/******************************************************************************
+ *
+ * iPhone pairing client
+ *
+ ******************************************************************************
+ */
+
+/** An iPhone USB multiplexed pseudo-TCP XML message header */
+struct ipair_header {
+ /** Message length */
+ uint32_t len;
+ /** Message */
+ char msg[0];
+} __attribute__ (( packed ));
+
+/** An iPhone pairing client */
+struct ipair {
+ /** Reference counter */
+ struct refcnt refcnt;
+ /** Data transfer interface */
+ struct interface xfer;
+
+ /** Pairing timer */
+ struct retry_timer timer;
+ /** Transmit message
+ *
+ * @v ipair Pairing client
+ * @ret rc Return status code
+ */
+ int ( * tx ) ( struct ipair *ipair );
+ /** Receive message
+ *
+ * @v ipair Pairing client
+ * @v msg XML message
+ * @ret rc Return status code
+ */
+ int ( * rx ) ( struct ipair *ipair, char *msg );
+ /** State flags */
+ unsigned int flags;
+
+ /** Pairing certificates */
+ struct icert icert;
+};
+
+/** Pairing client state flags */
+enum ipair_flags {
+ /** Request a new pairing */
+ IPAIR_REQUEST = 0x0001,
+ /** Standalone length has been received */
+ IPAIR_RX_LEN = 0x0002,
+ /** TLS session has been started */
+ IPAIR_TLS = 0x0004,
+};
+
+/** Pairing retry delay
+ *
+ * This is a policy decision.
+ */
+#define IPAIR_RETRY_DELAY ( 1 * TICKS_PER_SEC )
+
+/******************************************************************************
+ *
+ * iPhone USB networking
+ *
+ ******************************************************************************
+ */
+
+/** Get MAC address */
+#define IPHONE_GET_MAC \
+ ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
+ USB_REQUEST_TYPE ( 0x00 ) )
+
+/** Get link status */
+#define IPHONE_GET_LINK \
+ ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
+ USB_REQUEST_TYPE ( 0x45 ) )
+
+/** An iPhone link status */
+enum iphone_link_status {
+ /** Personal Hotspot is disabled */
+ IPHONE_LINK_DISABLED = 0x03,
+ /** Link up */
+ IPHONE_LINK_UP = 0x04,
+ /** Link not yet determined */
+ IPHONE_LINK_UNKNOWN = -1U,
+};
+
+/** An iPhone network device */
+struct iphone {
+ /** USB device */
+ struct usb_device *usb;
+ /** USB bus */
+ struct usb_bus *bus;
+ /** Network device */
+ struct net_device *netdev;
+ /** USB network device */
+ struct usbnet_device usbnet;
+
+ /** List of iPhone network devices */
+ struct list_head list;
+ /** Link status check timer */
+ struct retry_timer timer;
+};
+
+/** Bulk IN padding */
+#define IPHONE_IN_PAD 2
+
+/** Bulk IN buffer size
+ *
+ * This is a policy decision.
+ */
+#define IPHONE_IN_MTU ( ETH_FRAME_LEN + IPHONE_IN_PAD )
+
+/** Bulk IN maximum fill level
+ *
+ * This is a policy decision.
+ */
+#define IPHONE_IN_MAX_FILL 8
+
+/** Link check interval
+ *
+ * This is a policy decision.
+ */
+#define IPHONE_LINK_CHECK_INTERVAL ( 5 * TICKS_PER_SEC )
+
+#endif /* _IPHONE_H */