| #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 */ |