mirror of https://github.com/ipxe/ipxe.git
[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>pull/182/head
parent
f43a8f8b9f
commit
f47a45ea2d
File diff suppressed because it is too large
Load Diff
|
@ -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 */
|
|
@ -210,6 +210,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
#define ERRFILE_pcimsix ( ERRFILE_DRIVER | 0x00cc0000 )
|
||||
#define ERRFILE_intelxlvf ( ERRFILE_DRIVER | 0x00cd0000 )
|
||||
#define ERRFILE_usbblk ( ERRFILE_DRIVER | 0x00ce0000 )
|
||||
#define ERRFILE_iphone ( ERRFILE_DRIVER | 0x00cf0000 )
|
||||
|
||||
#define ERRFILE_aoe ( ERRFILE_NET | 0x00000000 )
|
||||
#define ERRFILE_arp ( ERRFILE_NET | 0x00010000 )
|
||||
|
|
Loading…
Reference in New Issue