mirror of
https://github.com/ipxe/ipxe
synced 2025-12-09 20:09:53 +03:00
[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>
This commit is contained in:
2268
src/drivers/net/iphone.c
Normal file
2268
src/drivers/net/iphone.c
Normal file
File diff suppressed because it is too large
Load Diff
291
src/drivers/net/iphone.h
Normal file
291
src/drivers/net/iphone.h
Normal file
@@ -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_pcimsix ( ERRFILE_DRIVER | 0x00cc0000 )
|
||||||
#define ERRFILE_intelxlvf ( ERRFILE_DRIVER | 0x00cd0000 )
|
#define ERRFILE_intelxlvf ( ERRFILE_DRIVER | 0x00cd0000 )
|
||||||
#define ERRFILE_usbblk ( ERRFILE_DRIVER | 0x00ce0000 )
|
#define ERRFILE_usbblk ( ERRFILE_DRIVER | 0x00ce0000 )
|
||||||
|
#define ERRFILE_iphone ( ERRFILE_DRIVER | 0x00cf0000 )
|
||||||
|
|
||||||
#define ERRFILE_aoe ( ERRFILE_NET | 0x00000000 )
|
#define ERRFILE_aoe ( ERRFILE_NET | 0x00000000 )
|
||||||
#define ERRFILE_arp ( ERRFILE_NET | 0x00010000 )
|
#define ERRFILE_arp ( ERRFILE_NET | 0x00010000 )
|
||||||
|
|||||||
Reference in New Issue
Block a user