#ifndef _IPHONE_H #define _IPHONE_H /** @file * * iPhone USB Ethernet driver * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include #include #include #include #include #include #include /****************************************************************************** * * 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 */