iPXE
Macros | Functions | Variables
iphone.c File Reference

iPhone USB Ethernet driver More...

#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/profile.h>
#include <ipxe/base64.h>
#include <ipxe/sha256.h>
#include <ipxe/rsa.h>
#include <ipxe/x509.h>
#include <ipxe/pem.h>
#include <ipxe/xfer.h>
#include <ipxe/tls.h>
#include <ipxe/usb.h>
#include "iphone.h"

Go to the source code of this file.

Macros

#define EPIPE_NO_MUX   __einfo_error ( EINFO_EPIPE_NO_MUX )
 
#define EINFO_EPIPE_NO_MUX
 
#define EINPROGRESS_PAIRING   __einfo_error ( EINFO_EINPROGRESS_PAIRING )
 
#define EINFO_EINPROGRESS_PAIRING
 
#define ENOTCONN_DISABLED   __einfo_error ( EINFO_ENOTCONN_DISABLED )
 
#define EINFO_ENOTCONN_DISABLED
 
#define ENOTCONN_STATUS(status)
 
#define icert_key_suffix   a
 Key pair selection. More...
 
#define icert_key_variable(prefix)   _C2 ( prefix, icert_key_suffix )
 
#define icert_public   icert_key_variable ( icert_public_ )
 
#define icert_private   icert_key_variable ( icert_private_ )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static int ipair_create (struct interface *xfer, unsigned int flags)
 Create a pairing client. More...
 
static LIST_HEAD (imuxes)
 List of USB multiplexers. More...
 
static LIST_HEAD (iphones)
 List of iPhone network devices. More...
 
static void icert_free (struct icert *icert)
 Free pairing certificates. More...
 
static int icert_cert (struct icert *icert, struct asn1_cursor *subject, struct asn1_cursor *issuer, struct asn1_cursor *private, struct asn1_cursor *public, struct asn1_cursor *exts, struct x509_certificate **cert)
 Construct certificate. More...
 
static int icert_certs (struct icert *icert, struct asn1_cursor *key)
 Construct certificates. More...
 
static int icert_encode (struct icert *icert, struct x509_certificate *cert, char **encenc)
 Construct doubly base64-encoded certificate. More...
 
static int imux_tx (struct imux *imux, struct io_buffer *iobuf)
 Transmit message. More...
 
static int imux_tx_version (struct imux *imux)
 Transmit version message. More...
 
static int imux_tx_tcp (struct imux *imux, struct io_buffer *iobuf)
 Transmit pseudo-TCP message. More...
 
static int imux_tx_syn (struct imux *imux)
 Transmit pseudo-TCP SYN. More...
 
static int imux_start_pair (struct imux *imux)
 Open pairing client. More...
 
static void imux_rx_version (struct imux *imux)
 Receive version message. More...
 
static void imux_rx_log (struct imux *imux, struct imux_header *hdr, size_t len)
 Receive log message. More...
 
static void imux_rx_syn (struct imux *imux)
 Receive pseudo-TCP SYN+ACK. More...
 
static void imux_rx_tcp (struct imux *imux, struct io_buffer *iobuf)
 Receive pseudo-TCP message. More...
 
static void imux_in_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete bulk IN transfer. More...
 
static void imux_out_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete bulk OUT transfer. More...
 
static void imux_shutdown (struct imux *imux)
 Shut down USB multiplexer. More...
 
static void imux_close (struct imux *imux, int rc)
 Close USB multiplexer. More...
 
static struct io_bufferimux_alloc_iob (struct imux *imux __unused, size_t len)
 Allocate I/O buffer for pseudo-TCP socket. More...
 
static int imux_deliver (struct imux *imux, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
 Transmit packet via pseudo-TCP socket. More...
 
static void imux_step (struct imux *imux)
 Multiplexer process. More...
 
static int imux_probe (struct usb_function *func, struct usb_configuration_descriptor *config)
 Probe device. More...
 
static void imux_remove (struct usb_function *func)
 Remove device. More...
 
static int ipair_tx_pubkey (struct ipair *ipair)
 Transmit DevicePublicKey message. More...
 
static int ipair_rx_pubkey (struct ipair *ipair, char *msg)
 Receive DevicePublicKey message. More...
 
static int ipair_tx_pair (struct ipair *ipair)
 Transmit Pair message. More...
 
static int ipair_rx_pair (struct ipair *ipair, char *msg)
 Receive Pair message. More...
 
static int ipair_tx_session (struct ipair *ipair)
 Transmit StartSession message. More...
 
static int ipair_rx_session (struct ipair *ipair, char *msg)
 Receive StartSession message. More...
 
static void ipair_free (struct refcnt *refcnt)
 Free pairing client. More...
 
static void ipair_close (struct ipair *ipair, int rc)
 Shut down pairing client. More...
 
static int ipair_tx (struct ipair *ipair, const char *fmt,...)
 Transmit XML message. More...
 
static int ipair_rx (struct ipair *ipair, char *msg, size_t len)
 Receive XML message payload. More...
 
static int ipair_tag (struct ipair *ipair, const char *msg, const char *tag, char **start, char **end)
 Locate XML tag. More...
 
static int ipair_key (struct ipair *ipair, const char *msg, const char *key, const char *type, char **start, char **end)
 Locate XML property list dictionary value. More...
 
static int ipair_rx_pair_error (struct ipair *ipair, char *error)
 Receive Pair message error. More...
 
static int ipair_rx_session_error (struct ipair *ipair, char *error)
 Receive StartSession message error. More...
 
static void ipair_window_changed (struct ipair *ipair)
 Handle window change notification. More...
 
static int ipair_deliver (struct ipair *ipair, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
 Handle received data. More...
 
static void ipair_expired (struct retry_timer *timer, int over __unused)
 Pairing transmission timer. More...
 
static void iphone_in_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete bulk IN transfer. More...
 
static int iphone_out_transmit (struct iphone *iphone, struct io_buffer *iobuf)
 Transmit packet. More...
 
static void iphone_out_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete bulk OUT transfer. More...
 
static int iphone_check_pair (struct iphone *iphone)
 Check pairing status. More...
 
static void iphone_check_link (struct net_device *netdev)
 Check link status. More...
 
static void iphone_expired (struct retry_timer *timer, int over __unused)
 Periodically update link status. More...
 
static int iphone_open (struct net_device *netdev)
 Open network device. More...
 
static void iphone_close (struct net_device *netdev)
 Close network device. More...
 
static int iphone_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet. More...
 
static void iphone_poll (struct net_device *netdev)
 Poll for completed and received packets. More...
 
static int iphone_probe (struct usb_function *func, struct usb_configuration_descriptor *config)
 Probe device. More...
 
static void iphone_remove (struct usb_function *func)
 Remove device. More...
 
 REQUIRING_SYMBOL (iphone_driver)
 
 REQUIRE_OBJECT (rsa_sha256)
 

Variables

static struct profiler iphone_in_profiler __profiler
 Bulk IN completion profiler. More...
 
static uint8_t icert_root_fingerprint [SHA256_DIGEST_SIZE]
 iPhone root certificate fingerprint More...
 
static struct x509_root icert_root
 Root of trust for iPhone certificates. More...
 
static const uint8_t icert_nul [] = { 0x00 }
 Single zero byte used in constructed certificates. More...
 
static const uint8_t icert_rsa []
 "RSA algorithm" identifier used in constructed certificates More...
 
static const uint8_t icert_sha256_rsa []
 "SHA-256 with RSA algorithm" identifier used in constructed certificates More...
 
static const uint8_t icert_root_exts_data []
 Extensions used in constructed root certificate. More...
 
static struct asn1_cursor icert_root_exts
 Extensions used in constructed root certificate. More...
 
static const uint8_t icert_leaf_exts_data []
 Extensions used in constructed leaf certificates. More...
 
static struct asn1_cursor icert_leaf_exts
 Extensions used in constructed leaf certificates. More...
 
static const uint8_t icert_tbs_prefix []
 "TBSCertificate" prefix in constructed certificates More...
 
static const uint8_t icert_validity []
 Validity period in constructed certificates. More...
 
static const uint8_t icert_name_root_data []
 "Root" subject name More...
 
static struct asn1_cursor icert_name_root
 "Root" subject name More...
 
static const uint8_t icert_name_ipxe_data []
 "iPXE" subject name More...
 
static struct asn1_cursor icert_name_ipxe
 "iPXE" subject name More...
 
static const uint8_t icert_name_iphone_data []
 "iPhone" subject name More...
 
static struct asn1_cursor icert_name_iphone
 "iPhone" subject name More...
 
static const uint8_t icert_public_a [] __unused
 Public key(s) used for pairing. More...
 
static const char icert_begin [] = "-----BEGIN CERTIFICATE-----\n"
 PEM certificate prefix. More...
 
static const char icert_end [] = "\n-----END CERTIFICATE-----\n"
 PEM certificate suffix. More...
 
static struct usb_endpoint_driver_operations imux_in_operations
 Bulk IN endpoint operations. More...
 
static struct usb_endpoint_driver_operations imux_out_operations
 Bulk OUT endpoint operations. More...
 
static struct interface_operation imux_tcp_operations []
 Pseudo-TCP socket interface operations. More...
 
static struct interface_descriptor imux_tcp_desc
 Pseudo-TCP socket interface descriptor. More...
 
static struct process_descriptor imux_process_desc
 Multiplexer process descriptor. More...
 
static struct usb_device_id imux_ids []
 USB multiplexer device IDs. More...
 
struct usb_driver imux_driver __usb_driver
 USB multiplexer driver. More...
 
static const char ipair_prefix []
 Common prefix for all pairing messages. More...
 
static const char ipair_suffix []
 Common suffix for all pairing messages. More...
 
static const char ipair_system_buid [] = "E4DB92D2-248A-469A-AC34-92045D07E695"
 Arbitrary system BUID used for pairing. More...
 
static const char ipair_host_id [] = "93CEBC27-8457-4804-9108-F42549DF6143"
 Arbitrary host ID used for pairing. More...
 
static struct interface_operation ipair_xfer_operations []
 Pairing client interface operations. More...
 
static struct interface_descriptor ipair_xfer_desc
 Pairing client interface descriptor. More...
 
static struct usb_endpoint_driver_operations iphone_in_operations
 Bulk IN endpoint operations. More...
 
static struct usb_endpoint_driver_operations iphone_out_operations
 Bulk OUT endpoint operations. More...
 
static struct net_device_operations iphone_operations
 iPhone network device operations More...
 
static struct usb_device_id iphone_ids []
 iPhone device IDs More...
 

Detailed Description

iPhone USB Ethernet driver

Definition in file iphone.c.

Macro Definition Documentation

◆ EPIPE_NO_MUX

#define EPIPE_NO_MUX   __einfo_error ( EINFO_EPIPE_NO_MUX )

Definition at line 52 of file iphone.c.

◆ EINFO_EPIPE_NO_MUX

#define EINFO_EPIPE_NO_MUX
Value:
"No USB multiplexer" )
#define EINFO_EPIPE
Definition: errno.h:621
#define __einfo_uniqify(einfo_base, uniq, desc)
Declare disambiguated error.
Definition: errno.h:181

Definition at line 53 of file iphone.c.

◆ EINPROGRESS_PAIRING

#define EINPROGRESS_PAIRING   __einfo_error ( EINFO_EINPROGRESS_PAIRING )

Definition at line 56 of file iphone.c.

◆ EINFO_EINPROGRESS_PAIRING

#define EINFO_EINPROGRESS_PAIRING
Value:
"Pairing in progress" )
#define EINFO_EINPROGRESS
Definition: errno.h:420
#define __einfo_uniqify(einfo_base, uniq, desc)
Declare disambiguated error.
Definition: errno.h:181

Definition at line 57 of file iphone.c.

◆ ENOTCONN_DISABLED

#define ENOTCONN_DISABLED   __einfo_error ( EINFO_ENOTCONN_DISABLED )

Definition at line 60 of file iphone.c.

◆ EINFO_ENOTCONN_DISABLED

#define EINFO_ENOTCONN_DISABLED
Value:
"Personal Hotspot disabled" )
Personal Hotspot is disabled.
Definition: iphone.h:247
#define __einfo_uniqify(einfo_base, uniq, desc)
Declare disambiguated error.
Definition: errno.h:181
#define EINFO_ENOTCONN
Definition: errno.h:571

Definition at line 61 of file iphone.c.

◆ ENOTCONN_STATUS

#define ENOTCONN_STATUS (   status)
Value:
EUNIQ ( EINFO_ENOTCONN, ( (status) & 0x1f ), \
uint8_t status
Status.
Definition: ena.h:16
#define EUNIQ(einfo_base, uniq,...)
Disambiguate a base error based on non-constant information.
Definition: errno.h:226
#define EINFO_ENOTCONN
Definition: errno.h:571
#define ENOTCONN_DISABLED
Definition: iphone.c:60

Definition at line 64 of file iphone.c.

◆ icert_key_suffix

#define icert_key_suffix   a

Key pair selection.

This exists only to allow for testing of the process for handling a failed TLS negotiation.

Definition at line 315 of file iphone.c.

◆ icert_key_variable

#define icert_key_variable (   prefix)    _C2 ( prefix, icert_key_suffix )

Definition at line 316 of file iphone.c.

◆ icert_public

#define icert_public   icert_key_variable ( icert_public_ )

Definition at line 317 of file iphone.c.

◆ icert_private

#define icert_private   icert_key_variable ( icert_private_ )

Definition at line 318 of file iphone.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ ipair_create()

static int ipair_create ( struct interface xfer,
unsigned int  flags 
)
static

Create a pairing client.

Parameters
xferData transfer interface
flagsInitial state flags
Return values
rcReturn status code

Definition at line 1835 of file iphone.c.

1835  {
1836  struct ipair *ipair;
1837  int rc;
1838 
1839  /* Allocate and initialise structure */
1840  ipair = zalloc ( sizeof ( *ipair ) );
1841  if ( ! ipair ) {
1842  rc = -ENOMEM;
1843  goto err_alloc;
1844  }
1847  timer_init ( &ipair->timer, ipair_expired, &ipair->refcnt );
1850  ipair->flags = flags;
1851 
1852  /* Schedule initial transmission */
1854 
1855  /* Attach to parent interface, mortalise self, and return */
1856  intf_plug_plug ( &ipair->xfer, xfer );
1857  ref_put ( &ipair->refcnt );
1858  return 0;
1859 
1860  ref_put ( &ipair->refcnt );
1861  err_alloc:
1862  return rc;
1863 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:100
int(* tx)(struct ipair *ipair)
Transmit message.
Definition: iphone.h:196
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:65
static void ipair_expired(struct retry_timer *timer, int over __unused)
Pairing transmission timer.
Definition: iphone.c:1800
struct interface xfer
Data transfer interface.
Definition: iphone.h:187
void intf_plug_plug(struct interface *a, struct interface *b)
Plug two object interfaces together.
Definition: interface.c:108
An iPhone pairing client.
Definition: iphone.h:183
#define ENOMEM
Not enough space.
Definition: errno.h:535
struct refcnt refcnt
Reference counter.
Definition: iphone.h:185
static struct interface_descriptor ipair_xfer_desc
Pairing client interface descriptor.
Definition: iphone.c:1825
uint8_t flags
Flags.
Definition: ena.h:18
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
static int ipair_tx_pubkey(struct ipair *ipair)
Transmit DevicePublicKey message.
Definition: iphone.c:1412
static int ipair_rx_pubkey(struct ipair *ipair, char *msg)
Receive DevicePublicKey message.
Definition: iphone.c:1435
static void ipair_free(struct refcnt *refcnt)
Free pairing client.
Definition: iphone.c:1233
int(* rx)(struct ipair *ipair, char *msg)
Receive message.
Definition: iphone.h:203
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:204
unsigned int flags
State flags.
Definition: iphone.h:205
struct retry_timer timer
Pairing timer.
Definition: iphone.h:190
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:107

References ENOMEM, flags, ipair::flags, intf_init(), intf_plug_plug(), ipair_expired(), ipair_free(), ipair_rx_pubkey(), ipair_tx_pubkey(), ipair_xfer_desc, rc, ref_init, ref_put, ipair::refcnt, ipair::rx, start_timer_nodelay(), ipair::timer, ipair::tx, ipair::xfer, and zalloc().

Referenced by imux_start_pair().

◆ LIST_HEAD() [1/2]

static LIST_HEAD ( imuxes  )
static

List of USB multiplexers.

◆ LIST_HEAD() [2/2]

static LIST_HEAD ( iphones  )
static

List of iPhone network devices.

◆ icert_free()

static void icert_free ( struct icert icert)
static

Free pairing certificates.

Parameters
icertPairing certificates

Definition at line 331 of file iphone.c.

331  {
332 
333  privkey_put ( icert->key );
334  x509_put ( icert->root );
335  x509_put ( icert->host );
336  x509_put ( icert->device );
337  memset ( icert, 0, sizeof ( *icert ) );
338 }
static void privkey_put(struct private_key *key)
Drop reference to private key.
Definition: privkey.h:42
struct x509_certificate * device
Device certificate.
Definition: iphone.h:39
struct x509_certificate * host
Host certificate.
Definition: iphone.h:37
struct x509_certificate * root
Root certificate.
Definition: iphone.h:35
static void x509_put(struct x509_certificate *cert)
Drop reference to X.509 certificate.
Definition: x509.h:278
struct private_key * key
"Private" key
Definition: iphone.h:33
An iPhone pairing certificate set.
Definition: iphone.h:31
void * memset(void *dest, int character, size_t len) __nonnull

References icert::device, icert::host, icert::key, memset(), privkey_put(), icert::root, and x509_put().

Referenced by icert_certs(), and ipair_free().

◆ icert_cert()

static int icert_cert ( struct icert icert,
struct asn1_cursor subject,
struct asn1_cursor issuer,
struct asn1_cursor private,
struct asn1_cursor public,
struct asn1_cursor exts,
struct x509_certificate **  cert 
)
static

Construct certificate.

Parameters
icertPairing certificates
subjectSubject name
issuerIssuer name
privatePrivate key
publicPublic key
extsCertificate extensions
certCertificate to fill in
Return values
rcReturn status code

On success, the caller is responsible for eventually calling x509_put() on the allocated encoded certificate.

Definition at line 355 of file iphone.c.

358  {
359  struct digest_algorithm *digest = &sha256_algorithm;
360  struct pubkey_algorithm *pubkey = &rsa_algorithm;
361  struct asn1_builder spki = { NULL, 0 };
362  struct asn1_builder tbs = { NULL, 0 };
363  struct asn1_builder raw = { NULL, 0 };
364  uint8_t digest_ctx[SHA256_CTX_SIZE];
365  uint8_t digest_out[SHA256_DIGEST_SIZE];
366  int rc;
367 
368  /* Construct subjectPublicKeyInfo */
369  if ( ( rc = ( asn1_prepend_raw ( &spki, public->data, public->len ),
370  asn1_prepend_raw ( &spki, icert_nul,
371  sizeof ( icert_nul ) ),
372  asn1_wrap ( &spki, ASN1_BIT_STRING ),
373  asn1_prepend_raw ( &spki, icert_rsa,
374  sizeof ( icert_rsa ) ),
375  asn1_wrap ( &spki, ASN1_SEQUENCE ) ) ) != 0 ) {
376  DBGC ( icert, "ICERT %p could not build subjectPublicKeyInfo: "
377  "%s\n", icert, strerror ( rc ) );
378  goto err_spki;
379  }
380 
381  /* Construct tbsCertificate */
382  if ( ( rc = ( asn1_prepend_raw ( &tbs, exts->data, exts->len ),
383  asn1_prepend_raw ( &tbs, spki.data, spki.len ),
384  asn1_prepend_raw ( &tbs, subject->data, subject->len ),
386  sizeof ( icert_validity ) ),
387  asn1_prepend_raw ( &tbs, issuer->data, issuer->len ),
389  sizeof ( icert_tbs_prefix ) ),
390  asn1_wrap ( &tbs, ASN1_SEQUENCE ) ) ) != 0 ) {
391  DBGC ( icert, "ICERT %p could not build tbsCertificate: %s\n",
392  icert, strerror ( rc ) );
393  goto err_tbs;
394  }
395 
396  /* Calculate certificate digest */
397  digest_init ( digest, digest_ctx );
398  digest_update ( digest, digest_ctx, tbs.data, tbs.len );
399  digest_final ( digest, digest_ctx, digest_out );
400 
401  /* Construct signature using "private" key */
402  if ( ( rc = pubkey_sign ( pubkey, private, digest, digest_out,
403  &raw ) ) != 0 ) {
404  DBGC ( icert, "ICERT %p could not sign: %s\n",
405  icert, strerror ( rc ) );
406  goto err_pubkey_sign;
407  }
408 
409  /* Construct raw certificate data */
410  if ( ( rc = ( asn1_prepend_raw ( &raw, icert_nul,
411  sizeof ( icert_nul ) ),
414  sizeof ( icert_sha256_rsa ) ),
415  asn1_prepend_raw ( &raw, tbs.data, tbs.len ),
416  asn1_wrap ( &raw, ASN1_SEQUENCE ) ) ) != 0 ) {
417  DBGC ( icert, "ICERT %p could not build certificate: %s\n",
418  icert, strerror ( rc ) );
419  goto err_raw;
420  }
421 
422  /* Parse certificate */
423  if ( ( rc = x509_certificate ( raw.data, raw.len, cert ) ) != 0 ) {
424  DBGC ( icert, "ICERT %p invalid certificate: %s\n",
425  icert, strerror ( rc ) );
426  DBGC_HDA ( icert, 0, raw.data, raw.len );
427  goto err_x509;
428  }
429 
430  err_x509:
431  err_raw:
432  err_pubkey_sign:
433  err_tbs:
434  err_spki:
435  free ( raw.data );
436  free ( tbs.data );
437  free ( spki.data );
438  return rc;
439 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void digest_update(struct digest_algorithm *digest, void *ctx, const void *data, size_t len)
Definition: crypto.h:224
void * data
Data.
Definition: asn1.h:36
#define SHA256_DIGEST_SIZE
Definition: Tpm20.h:30
#define SHA256_CTX_SIZE
SHA-256 context size.
Definition: sha256.h:72
static void digest_final(struct digest_algorithm *digest, void *ctx, void *out)
Definition: crypto.h:230
int asn1_prepend_raw(struct asn1_builder *builder, const void *data, size_t len)
Prepend raw data to ASN.1 builder.
Definition: asn1.c:949
const void * data
Start of data.
Definition: asn1.h:23
#define DBGC(...)
Definition: compiler.h:505
size_t len
Length of data.
Definition: asn1.h:25
static const uint8_t icert_sha256_rsa[]
"SHA-256 with RSA algorithm" identifier used in constructed certificates
Definition: iphone.c:114
static int pubkey_sign(struct pubkey_algorithm *pubkey, const struct asn1_cursor *key, struct digest_algorithm *digest, const void *value, struct asn1_builder *signature)
Definition: crypto.h:301
#define DBGC_HDA(...)
Definition: compiler.h:506
static const uint8_t icert_validity[]
Validity period in constructed certificates.
Definition: iphone.c:187
static void digest_init(struct digest_algorithm *digest, void *ctx)
Definition: crypto.h:219
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
An X.509 certificate.
Definition: x509.h:216
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
An ASN.1 object builder.
Definition: asn1.h:29
unsigned char uint8_t
Definition: stdint.h:10
int asn1_wrap(struct asn1_builder *builder, unsigned int type)
Wrap ASN.1 builder.
Definition: asn1.c:999
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
static const uint8_t icert_rsa[]
"RSA algorithm" identifier used in constructed certificates
Definition: iphone.c:106
struct digest_algorithm sha256_algorithm
SHA-256 algorithm.
Definition: sha256.c:265
struct pubkey_algorithm rsa_algorithm
RSA public-key algorithm.
Definition: rsa.c:661
A message digest algorithm.
Definition: crypto.h:19
__be32 raw[7]
Definition: CIB_PRM.h:28
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
size_t len
Length of data.
Definition: asn1.h:38
A public key algorithm.
Definition: crypto.h:122
static const uint8_t icert_tbs_prefix[]
"TBSCertificate" prefix in constructed certificates
Definition: iphone.c:175
#define ASN1_BIT_STRING
ASN.1 bit string.
Definition: asn1.h:66
An iPhone pairing certificate set.
Definition: iphone.h:31
static const uint8_t icert_nul[]
Single zero byte used in constructed certificates.
Definition: iphone.c:103

References ASN1_BIT_STRING, asn1_prepend_raw(), ASN1_SEQUENCE, asn1_wrap(), asn1_cursor::data, asn1_builder::data, DBGC, DBGC_HDA, digest_final(), digest_init(), digest_update(), free, icert_nul, icert_rsa, icert_sha256_rsa, icert_tbs_prefix, icert_validity, asn1_cursor::len, asn1_builder::len, NULL, pubkey_sign(), raw, rc, rsa_algorithm, sha256_algorithm, SHA256_CTX_SIZE, SHA256_DIGEST_SIZE, and strerror().

Referenced by icert_certs().

◆ icert_certs()

static int icert_certs ( struct icert icert,
struct asn1_cursor key 
)
static

Construct certificates.

Parameters
icertCertificate set
pubkeyDevice public key
Return values
rcReturn status code

Definition at line 448 of file iphone.c.

448  {
449  struct digest_algorithm *digest = icert_root.digest;
450  struct asn1_builder public = { NULL, 0 };
451  struct asn1_builder *private;
452  int rc;
453 
454  /* Free any existing key and certificates */
455  icert_free ( icert );
456 
457  /* Allocate "private" key */
458  icert->key = zalloc ( sizeof ( *icert->key ) );
459  if ( ! icert->key ) {
460  rc = -ENOMEM;
461  goto error;
462  }
463  privkey_init ( icert->key );
464  private = &icert->key->builder;
465 
466  /* Construct our "private" key */
467  if ( ( rc = ( asn1_prepend_raw ( private, icert_private,
468  sizeof ( icert_private ) ),
469  asn1_prepend_raw ( private, icert_public,
470  sizeof ( icert_public ) ),
471  asn1_prepend ( private, ASN1_INTEGER, icert_nul,
472  sizeof ( icert_nul ) ),
473  asn1_wrap ( private, ASN1_SEQUENCE ) ) ) != 0 ) {
474  DBGC ( icert, "ICERT %p could not build private key: %s\n",
475  icert, strerror ( rc ) );
476  goto error;
477  }
478 
479  /* Construct our own public key */
480  if ( ( rc = ( asn1_prepend_raw ( &public, icert_public,
481  sizeof ( icert_public ) ),
482  asn1_wrap ( &public, ASN1_SEQUENCE ) ) ) != 0 ) {
483  DBGC ( icert, "ICERT %p could not build public key: %s\n",
484  icert, strerror ( rc ) );
485  goto error;
486  }
487 
488  /* Construct root certificate */
490  asn1_built ( private ), asn1_built ( &public ),
491  &icert_root_exts, &icert->root ) ) != 0 )
492  goto error;
493 
494  /* Construct host certificate */
496  asn1_built ( private ), asn1_built ( &public ),
497  &icert_leaf_exts, &icert->host ) ) != 0 )
498  goto error;
499 
500  /* Construct device certificate */
502  asn1_built ( private ), key,
503  &icert_leaf_exts, &icert->device ) ) != 0 )
504  goto error;
505 
506  /* Construct root of trust */
507  assert ( digest->digestsize == sizeof ( icert_root_fingerprint ) );
509 
510  /* Free constructed keys */
511  free ( public.data );
512  return 0;
513 
514  error:
515  icert_free ( icert );
516  free ( public.data );
517  return rc;
518 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define icert_public
Definition: iphone.c:317
static struct asn1_cursor icert_name_ipxe
"iPXE" subject name
Definition: iphone.c:221
static struct asn1_cursor icert_leaf_exts
Extensions used in constructed leaf certificates.
Definition: iphone.c:171
struct arbelprm_completion_with_error error
Definition: arbel.h:12
int asn1_prepend_raw(struct asn1_builder *builder, const void *data, size_t len)
Prepend raw data to ASN.1 builder.
Definition: asn1.c:949
static struct x509_root icert_root
Root of trust for iPhone certificates.
Definition: iphone.c:95
#define DBGC(...)
Definition: compiler.h:505
struct x509_certificate * device
Device certificate.
Definition: iphone.h:39
static struct asn1_cursor icert_name_iphone
"iPhone" subject name
Definition: iphone.c:234
struct x509_certificate * host
Host certificate.
Definition: iphone.h:37
struct asn1_builder builder
ASN.1 object builder.
Definition: privkey.h:21
#define ENOMEM
Not enough space.
Definition: errno.h:535
static struct asn1_cursor icert_root_exts
Extensions used in constructed root certificate.
Definition: iphone.c:138
static struct asn1_cursor icert_name_root
"Root" subject name
Definition: iphone.c:209
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static uint8_t icert_root_fingerprint[SHA256_DIGEST_SIZE]
iPhone root certificate fingerprint
Definition: iphone.c:92
struct digest_algorithm * digest
Fingerprint digest algorithm.
Definition: x509.h:379
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
An ASN.1 object builder.
Definition: asn1.h:29
int asn1_wrap(struct asn1_builder *builder, unsigned int type)
Wrap ASN.1 builder.
Definition: asn1.c:999
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
void x509_fingerprint(struct x509_certificate *cert, struct digest_algorithm *digest, void *fingerprint)
Calculate X.509 certificate fingerprint.
Definition: x509.c:1237
#define ASN1_INTEGER
ASN.1 integer.
Definition: asn1.h:63
struct x509_certificate * root
Root certificate.
Definition: iphone.h:35
size_t digestsize
Digest size.
Definition: crypto.h:27
struct private_key * key
"Private" key
Definition: iphone.h:33
int asn1_prepend(struct asn1_builder *builder, unsigned int type, const void *data, size_t len)
Prepend data to ASN.1 builder.
Definition: asn1.c:972
A message digest algorithm.
Definition: crypto.h:19
static int icert_cert(struct icert *icert, struct asn1_cursor *subject, struct asn1_cursor *issuer, struct asn1_cursor *private, struct asn1_cursor *public, struct asn1_cursor *exts, struct x509_certificate **cert)
Construct certificate.
Definition: iphone.c:355
uint8_t data[48]
Additional event data.
Definition: ena.h:22
static struct asn1_cursor * asn1_built(struct asn1_builder *builder)
Get cursor for built object.
Definition: asn1.h:492
static void privkey_init(struct private_key *key)
Initialise empty private key.
Definition: privkey.h:64
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
union @391 key
Sense key.
Definition: scsi.h:18
An iPhone pairing certificate set.
Definition: iphone.h:31
static void icert_free(struct icert *icert)
Free pairing certificates.
Definition: iphone.c:331
static const uint8_t icert_nul[]
Single zero byte used in constructed certificates.
Definition: iphone.c:103
#define icert_private
Definition: iphone.c:318

References asn1_built(), ASN1_INTEGER, asn1_prepend(), asn1_prepend_raw(), ASN1_SEQUENCE, asn1_wrap(), assert(), private_key::builder, data, DBGC, icert::device, x509_root::digest, digest_algorithm::digestsize, ENOMEM, error, free, icert::host, icert_cert(), icert_free(), icert_leaf_exts, icert_name_iphone, icert_name_ipxe, icert_name_root, icert_nul, icert_private, icert_public, icert_root, icert_root_exts, icert_root_fingerprint, icert::key, key, NULL, privkey_init(), rc, icert::root, strerror(), x509_fingerprint(), and zalloc().

Referenced by ipair_rx_pubkey().

◆ icert_encode()

static int icert_encode ( struct icert icert,
struct x509_certificate cert,
char **  encenc 
)
static

Construct doubly base64-encoded certificate.

Parameters
icertPairing certificates
certX.509 certificate
encencDoubly base64-encoded certificate to construct
Return values
rcReturn status code

On success, the caller is responsible for eventually calling free() on the allocated doubly encoded encoded certificate.

Definition at line 531 of file iphone.c.

532  {
533  size_t encencoded_len;
534  size_t encoded_len;
535  size_t pem_len;
536  char *pem;
537  int rc;
538 
539  /* Sanity check */
540  assert ( cert != NULL );
541 
542  /* Create PEM */
543  encoded_len = ( base64_encoded_len ( cert->raw.len ) + 1 /* NUL */ );
544  pem_len = ( ( sizeof ( icert_begin ) - 1 /* NUL */ ) +
545  ( encoded_len - 1 /* NUL */ ) +
546  ( sizeof ( icert_end ) - 1 /* NUL */ ) +
547  1 /* NUL */ );
548  pem = malloc ( pem_len );
549  if ( ! pem ) {
550  rc = -ENOMEM;
551  goto err_alloc_pem;
552  }
553  strcpy ( pem, icert_begin );
554  base64_encode ( cert->raw.data, cert->raw.len,
555  ( pem + sizeof ( icert_begin ) - 1 /* NUL */ ),
556  encoded_len );
557  strcpy ( ( pem +
558  ( sizeof ( icert_begin ) - 1 /* NUL */ ) +
559  ( encoded_len - 1 /* NUL */ ) ), icert_end );
560  DBGC2 ( icert, "ICERT %p \"%s\" certificate:\n%s",
561  icert, x509_name ( cert ), pem );
562 
563  /* Base64-encode the PEM (sic) */
564  encencoded_len = ( base64_encoded_len ( pem_len - 1 /* NUL */ )
565  + 1 /* NUL */ );
566  *encenc = malloc ( encencoded_len );
567  if ( ! *encenc ) {
568  rc = -ENOMEM;
569  goto err_alloc_encenc;
570  }
571  base64_encode ( pem, ( pem_len - 1 /* NUL */ ), *encenc,
572  encencoded_len );
573 
574  /* Success */
575  rc = 0;
576 
577  err_alloc_encenc:
578  free ( pem );
579  err_alloc_pem:
580  return rc;
581 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static const char icert_end[]
PEM certificate suffix.
Definition: iphone.c:324
const void * data
Start of data.
Definition: asn1.h:23
static const char icert_begin[]
PEM certificate prefix.
Definition: iphone.c:321
size_t len
Length of data.
Definition: asn1.h:25
static size_t base64_encoded_len(size_t raw_len)
Calculate length of base64-encoded data.
Definition: base64.h:22
#define ENOMEM
Not enough space.
Definition: errno.h:535
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
char * strcpy(char *dest, const char *src)
Copy string.
Definition: string.c:347
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:621
const char * x509_name(struct x509_certificate *cert)
Get X.509 certificate display name.
Definition: x509.c:147
#define DBGC2(...)
Definition: compiler.h:522
struct asn1_cursor raw
Raw certificate.
Definition: x509.h:231
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
An iPhone pairing certificate set.
Definition: iphone.h:31
size_t base64_encode(const void *raw, size_t raw_len, char *data, size_t len)
Base64-encode data.
Definition: base64.c:52

References assert(), base64_encode(), base64_encoded_len(), asn1_cursor::data, DBGC2, ENOMEM, free, icert_begin, icert_end, asn1_cursor::len, malloc(), NULL, x509_certificate::raw, rc, strcpy(), and x509_name().

Referenced by ipair_tx_pair().

◆ imux_tx()

static int imux_tx ( struct imux imux,
struct io_buffer iobuf 
)
static

Transmit message.

Parameters
imuxUSB multiplexer
iobufI/O buffer
Return values
rcReturn status code

Definition at line 601 of file iphone.c.

601  {
602  struct imux_header *hdr = iobuf->data;
603  size_t len = iob_len ( iobuf );
604  int rc;
605 
606  /* Populate header */
607  assert ( len >= sizeof ( *hdr ) );
608  hdr->len = htonl ( len );
609  hdr->in_seq = htons ( imux->in_seq );
610  hdr->out_seq = htons ( imux->out_seq );
611  DBGCP ( imux, "IMUX %p transmitting:\n", imux );
612  DBGCP_HDA ( imux, 0, hdr, len );
613 
614  /* Transmit message */
615  if ( ( rc = usb_stream ( &imux->usbnet.out, iobuf, 1 ) ) != 0 )
616  goto err;
617 
618  /* Increment sequence number */
619  imux->out_seq++;
620 
621  return 0;
622 
623  err:
624  free_iob ( iobuf );
625  return rc;
626 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An iPhone USB multiplexed packet header.
Definition: iphone.h:50
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
uint16_t out_seq
Output sequence.
Definition: iphone.h:139
int usb_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
Enqueue USB stream transfer.
Definition: usb.c:546
#define htonl(value)
Definition: byteswap.h:134
struct usb_endpoint out
Bulk OUT endpoint.
Definition: usbnet.h:32
#define DBGCP_HDA(...)
Definition: compiler.h:540
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
ring len
Length.
Definition: dwmac.h:231
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
uint16_t in_seq
Input sequence.
Definition: iphone.h:137
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:123
void * data
Start of data.
Definition: iobuf.h:53
#define DBGCP(...)
Definition: compiler.h:539
#define htons(value)
Definition: byteswap.h:136

References assert(), io_buffer::data, DBGCP, DBGCP_HDA, free_iob(), hdr, htonl, htons, imux::in_seq, iob_len(), len, usbnet_device::out, imux::out_seq, rc, usb_stream(), and imux::usbnet.

Referenced by imux_tx_tcp(), and imux_tx_version().

◆ imux_tx_version()

static int imux_tx_version ( struct imux imux)
static

Transmit version message.

Parameters
imuxUSB multiplexer
Return values
rcReturn status code

Definition at line 634 of file iphone.c.

634  {
635  struct io_buffer *iobuf;
636  struct imux_header_version *vers;
637  int rc;
638 
639  /* Allocate I/O buffer */
640  iobuf = alloc_iob ( sizeof ( *vers ) );
641  if ( ! iobuf )
642  return -ENOMEM;
643  vers = iob_put ( iobuf, sizeof ( *vers ) );
644 
645  /* Construct version message */
646  memset ( vers, 0, sizeof ( *vers ) );
647  vers->hdr.protocol = htonl ( IMUX_VERSION );
648 
649  /* Transmit message */
650  if ( ( rc = imux_tx ( imux, iob_disown ( iobuf ) ) ) != 0 )
651  return rc;
652 
653  return 0;
654 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:125
uint32_t protocol
Protocol.
Definition: iphone.h:52
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:131
#define htonl(value)
Definition: byteswap.h:134
#define ENOMEM
Not enough space.
Definition: errno.h:535
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
An iPhone USB multiplexed version message header.
Definition: iphone.h:74
An iPhone USB multiplexer.
Definition: iphone.h:115
Version number.
Definition: iphone.h:66
static int imux_tx(struct imux *imux, struct io_buffer *iobuf)
Transmit message.
Definition: iphone.c:601
struct imux_header hdr
Multiplexed packet header.
Definition: iphone.h:76
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:38

References alloc_iob(), ENOMEM, imux_header_version::hdr, htonl, imux_tx(), IMUX_VERSION, iob_disown, iob_put, memset(), imux_header::protocol, and rc.

Referenced by imux_probe().

◆ imux_tx_tcp()

static int imux_tx_tcp ( struct imux imux,
struct io_buffer iobuf 
)
static

Transmit pseudo-TCP message.

Parameters
imuxUSB multiplexer
iobufI/O buffer
Return values
rcReturn status code

Definition at line 663 of file iphone.c.

663  {
664  struct imux_header_tcp *tcp = iobuf->data;
665  size_t len = iob_len ( iobuf );
666  int rc;
667 
668  /* Populate TCP header */
669  assert ( len >= sizeof ( *tcp ) );
670  tcp->hdr.protocol = htonl ( IMUX_TCP );
671  tcp->tcp.src = htons ( imux->port );
672  tcp->tcp.dest = htons ( IMUX_PORT_LOCKDOWND );
673  tcp->tcp.seq = htonl ( imux->tcp_seq );
674  tcp->tcp.ack = htonl ( imux->tcp_ack );
675  tcp->tcp.hlen = ( ( sizeof ( tcp->tcp ) / 4 ) << 4 );
676  tcp->tcp.win = htons ( IMUX_WINDOW );
677 
678  /* Transmit message */
679  if ( ( rc = imux_tx ( imux, iob_disown ( iobuf ) ) ) != 0 )
680  return rc;
681 
682  /* Update TCP sequence */
683  imux->tcp_seq += ( len - sizeof ( *tcp ) );
684 
685  return 0;
686 }
uint32_t tcp_ack
Pseudo-TCP acknowledgement number.
Definition: iphone.h:143
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
TCP packet.
Definition: iphone.h:70
uint32_t seq
Definition: tcp.h:23
An iPhone USB multiplexed pseudo-TCP message header.
Definition: iphone.h:92
#define IMUX_WINDOW
Advertised TCP window.
Definition: iphone.h:112
#define htonl(value)
Definition: byteswap.h:134
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
uint32_t ack
Definition: tcp.h:24
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct tcp_header tcp
Pseudo-TCP header.
Definition: iphone.h:96
ring len
Length.
Definition: dwmac.h:231
uint16_t win
Definition: tcp.h:27
uint16_t dest
Definition: tcp.h:22
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
An iPhone USB multiplexer.
Definition: iphone.h:115
uint32_t tcp_seq
Pseudo-TCP sequence number.
Definition: iphone.h:141
#define IMUX_PORT_LOCKDOWND
Lockdown daemon port number.
Definition: iphone.h:106
void * data
Start of data.
Definition: iobuf.h:53
static int imux_tx(struct imux *imux, struct io_buffer *iobuf)
Transmit message.
Definition: iphone.c:601
uint16_t port
Pseudo-TCP local port number.
Definition: iphone.h:145
uint16_t src
Definition: tcp.h:21
#define htons(value)
Definition: byteswap.h:136
uint8_t hlen
Definition: tcp.h:25

References tcp_header::ack, assert(), io_buffer::data, tcp_header::dest, tcp_header::hlen, htonl, htons, IMUX_PORT_LOCKDOWND, IMUX_TCP, imux_tx(), IMUX_WINDOW, iob_disown, iob_len(), len, imux::port, rc, tcp_header::seq, tcp_header::src, imux_header_tcp::tcp, imux::tcp_ack, imux::tcp_seq, and tcp_header::win.

Referenced by imux_deliver(), and imux_tx_syn().

◆ imux_tx_syn()

static int imux_tx_syn ( struct imux imux)
static

Transmit pseudo-TCP SYN.

Parameters
imuxUSB multiplexer
Return values
rcReturn status code

Definition at line 694 of file iphone.c.

694  {
695  struct io_buffer *iobuf;
696  struct imux_header_tcp *syn;
697  int rc;
698 
699  /* Allocate I/O buffer */
700  iobuf = alloc_iob ( sizeof ( *syn ) );
701  if ( ! iobuf )
702  return -ENOMEM;
703  syn = iob_put ( iobuf, sizeof ( *syn ) );
704 
705  /* Construct TCP SYN message */
706  memset ( syn, 0, sizeof ( *syn ) );
707  syn->tcp.flags = TCP_SYN;
708 
709  /* Transmit message */
710  if ( ( rc = imux_tx_tcp ( imux, iob_disown ( iobuf ) ) ) != 0 )
711  return rc;
712 
713  /* Increment TCP sequence to compensate for SYN */
714  imux->tcp_seq++;
715 
716  return 0;
717 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:125
uint8_t flags
Definition: tcp.h:26
An iPhone USB multiplexed pseudo-TCP message header.
Definition: iphone.h:92
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:131
#define TCP_SYN
Definition: tcp.h:163
#define ENOMEM
Not enough space.
Definition: errno.h:535
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
struct tcp_header tcp
Pseudo-TCP header.
Definition: iphone.h:96
An iPhone USB multiplexer.
Definition: iphone.h:115
static int imux_tx_tcp(struct imux *imux, struct io_buffer *iobuf)
Transmit pseudo-TCP message.
Definition: iphone.c:663
uint32_t tcp_seq
Pseudo-TCP sequence number.
Definition: iphone.h:141
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:38

References alloc_iob(), ENOMEM, tcp_header::flags, imux_tx_tcp(), iob_disown, iob_put, memset(), rc, imux_header_tcp::tcp, imux::tcp_seq, and TCP_SYN.

Referenced by imux_close(), and imux_rx_version().

◆ imux_start_pair()

static int imux_start_pair ( struct imux imux)
static

Open pairing client.

Parameters
imuxUSB multiplexer
Return values
rcReturn status code

Definition at line 725 of file iphone.c.

725  {
726  int rc;
727 
728  /* Disconnect any existing pairing client */
729  intf_restart ( &imux->tcp, -EPIPE );
730 
731  /* Create pairing client */
732  if ( ( rc = ipair_create ( &imux->tcp, imux->flags ) ) != 0 )
733  return rc;
734 
735  return 0;
736 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:344
static int ipair_create(struct interface *xfer, unsigned int flags)
Create a pairing client.
Definition: iphone.c:1835
#define EPIPE
Broken pipe.
Definition: errno.h:620
struct interface tcp
Pseudo-TCP lockdown socket interface.
Definition: iphone.h:148
An iPhone USB multiplexer.
Definition: iphone.h:115
unsigned int flags
Pairing flags.
Definition: iphone.h:150

References EPIPE, imux::flags, intf_restart(), ipair_create(), rc, and imux::tcp.

Referenced by imux_rx_syn().

◆ imux_rx_version()

static void imux_rx_version ( struct imux imux)
static

Receive version message.

Parameters
imuxUSB multiplexer

Definition at line 743 of file iphone.c.

743  {
744 
745  /* Reset output sequence */
746  imux->out_seq = 0;
747 
748  /* Send TCP SYN */
750 }
static int imux_tx_syn(struct imux *imux)
Transmit pseudo-TCP SYN.
Definition: iphone.c:694
int(* action)(struct imux *imux)
Pending action.
Definition: iphone.h:134
uint16_t out_seq
Output sequence.
Definition: iphone.h:139
An iPhone USB multiplexer.
Definition: iphone.h:115

References imux::action, imux_tx_syn(), and imux::out_seq.

Referenced by imux_in_complete().

◆ imux_rx_log()

static void imux_rx_log ( struct imux imux,
struct imux_header hdr,
size_t  len 
)
static

Receive log message.

Parameters
imuxUSB multiplexer
hdrMessage header
lenLength of message

Definition at line 759 of file iphone.c.

760  {
761  struct imux_header_log *log =
762  container_of ( hdr, struct imux_header_log, hdr );
763  unsigned int level;
764  size_t msg_len;
765  char *tmp;
766 
767  /* Sanity check */
768  if ( len < sizeof ( *log ) ) {
769  DBGC ( imux, "IMUX %p malformed log message:\n", imux );
770  DBGC_HDA ( imux, 0, log, len );
771  return;
772  }
773 
774  /* First byte is the log level, followed by a printable
775  * message with no NUL terminator. Extract the log level,
776  * then shuffle the message down within the buffer and append
777  * a NUL terminator.
778  */
779  msg_len = ( len - sizeof ( *hdr ) );
780  level = log->level;
781  tmp = ( ( void * ) &log->level );
782  memmove ( tmp, &log->msg, msg_len );
783  tmp[msg_len] = '\0';
784 
785  /* Print log message */
786  DBGC ( imux, "IMUX %p <%d>: %s\n", imux, level, tmp );
787 }
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
char msg[0]
Message.
Definition: iphone.h:88
#define DBGC(...)
Definition: compiler.h:505
An iPhone USB multiplexed log message header.
Definition: iphone.h:82
unsigned long tmp
Definition: linux_pci.h:65
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
#define DBGC_HDA(...)
Definition: compiler.h:506
ring len
Length.
Definition: dwmac.h:231
An iPhone USB multiplexer.
Definition: iphone.h:115
void * memmove(void *dest, const void *src, size_t len) __nonnull
uint8_t level
Log level.
Definition: iphone.h:86

References container_of, DBGC, DBGC_HDA, hdr, len, imux_header_log::level, memmove(), imux_header_log::msg, and tmp.

Referenced by imux_in_complete().

◆ imux_rx_syn()

static void imux_rx_syn ( struct imux imux)
static

Receive pseudo-TCP SYN+ACK.

Parameters
imuxUSB multiplexer

Definition at line 794 of file iphone.c.

794  {
795 
796  /* Increment TCP acknowledgement to compensate for SYN */
797  imux->tcp_ack++;
798 
799  /* Start pairing client */
801 }
uint32_t tcp_ack
Pseudo-TCP acknowledgement number.
Definition: iphone.h:143
int(* action)(struct imux *imux)
Pending action.
Definition: iphone.h:134
An iPhone USB multiplexer.
Definition: iphone.h:115
static int imux_start_pair(struct imux *imux)
Open pairing client.
Definition: iphone.c:725

References imux::action, imux_start_pair(), and imux::tcp_ack.

Referenced by imux_rx_tcp().

◆ imux_rx_tcp()

static void imux_rx_tcp ( struct imux imux,
struct io_buffer iobuf 
)
static

Receive pseudo-TCP message.

Parameters
imuxUSB multiplexer
iobufI/O buffer

Definition at line 809 of file iphone.c.

809  {
810  struct imux_header_tcp *tcp = iobuf->data;
811  size_t len = iob_len ( iobuf );
812  int rc;
813 
814  /* Sanity check */
815  if ( len < sizeof ( *tcp ) ) {
816  DBGC ( imux, "IMUX %p malformed TCP message:\n", imux );
817  DBGC_HDA ( imux, 0, tcp, len );
818  goto error;
819  }
820 
821  /* Ignore unexpected packets */
822  if ( tcp->tcp.dest != htons ( imux->port ) ) {
823  DBGC ( imux, "IMUX %p ignoring unexpected TCP port %d:\n",
824  imux, ntohs ( tcp->tcp.dest ) );
825  DBGC_HDA ( imux, 0, tcp, len );
826  goto error;
827  }
828 
829  /* Ignore resets */
830  if ( tcp->tcp.flags & TCP_RST ) {
831  DBGC ( imux, "IMUX %p ignoring TCP RST\n", imux );
832  DBGC2_HDA ( imux, 0, tcp, len );
833  goto error;
834  }
835 
836  /* Record ACK number */
837  imux->tcp_ack = ( ntohl ( tcp->tcp.seq ) + len - sizeof ( *tcp ) );
838 
839  /* Handle received message */
840  if ( tcp->tcp.flags & TCP_SYN ) {
841 
842  /* Received SYN+ACK */
843  imux_rx_syn ( imux );
844 
845  } else {
846 
847  /* Strip header */
848  iob_pull ( iobuf, sizeof ( *tcp ) );
849 
850  /* Deliver via socket */
851  if ( ( rc = xfer_deliver_iob ( &imux->tcp,
852  iob_disown ( iobuf ) ) ) != 0 )
853  goto error;
854  }
855 
856  error:
857  free_iob ( iobuf );
858 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:107
uint32_t tcp_ack
Pseudo-TCP acknowledgement number.
Definition: iphone.h:143
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int xfer_deliver_iob(struct interface *intf, struct io_buffer *iobuf)
Deliver datagram as I/O buffer without metadata.
Definition: xfer.c:256
static void imux_rx_syn(struct imux *imux)
Receive pseudo-TCP SYN+ACK.
Definition: iphone.c:794
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
struct arbelprm_completion_with_error error
Definition: arbel.h:12
struct interface tcp
Pseudo-TCP lockdown socket interface.
Definition: iphone.h:148
#define DBGC(...)
Definition: compiler.h:505
uint8_t flags
Definition: tcp.h:26
uint32_t seq
Definition: tcp.h:23
An iPhone USB multiplexed pseudo-TCP message header.
Definition: iphone.h:92
#define ntohl(value)
Definition: byteswap.h:135
#define ntohs(value)
Definition: byteswap.h:137
#define TCP_RST
Definition: tcp.h:162
#define TCP_SYN
Definition: tcp.h:163
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
struct tcp_header tcp
Pseudo-TCP header.
Definition: iphone.h:96
#define DBGC_HDA(...)
Definition: compiler.h:506
ring len
Length.
Definition: dwmac.h:231
uint16_t dest
Definition: tcp.h:22
#define DBGC2_HDA(...)
Definition: compiler.h:523
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
An iPhone USB multiplexer.
Definition: iphone.h:115
void * data
Start of data.
Definition: iobuf.h:53
uint16_t port
Pseudo-TCP local port number.
Definition: iphone.h:145
#define htons(value)
Definition: byteswap.h:136

References io_buffer::data, DBGC, DBGC2_HDA, DBGC_HDA, tcp_header::dest, error, tcp_header::flags, free_iob(), htons, imux_rx_syn(), iob_disown, iob_len(), iob_pull, len, ntohl, ntohs, imux::port, rc, tcp_header::seq, imux_header_tcp::tcp, imux::tcp, imux::tcp_ack, TCP_RST, TCP_SYN, and xfer_deliver_iob().

Referenced by imux_in_complete().

◆ imux_in_complete()

static void imux_in_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete bulk IN transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 867 of file iphone.c.

868  {
869  struct imux *imux = container_of ( ep, struct imux, usbnet.in );
870  struct imux_header *hdr = iobuf->data;
871  size_t len = iob_len ( iobuf );
872 
873  /* Ignore packets cancelled when the endpoint closes */
874  if ( ! ep->open )
875  goto drop;
876 
877  /* Report USB errors */
878  if ( rc != 0 ) {
879  DBGC ( imux, "IMUX %p bulk IN failed: %s\n",
880  imux, strerror ( rc ) );
881  goto drop;
882  }
883 
884  /* Sanity check */
885  if ( len < sizeof ( *hdr ) ) {
886  DBGC ( imux, "IMUX %p malformed message:\n", imux );
887  DBGC_HDA ( imux, 0, hdr, len );
888  goto drop;
889  }
890 
891  /* Record input sequence */
892  imux->in_seq = ntohs ( hdr->in_seq );
893 
894  /* Handle according to protocol */
895  DBGCP ( imux, "IMUX %p received:\n", imux );
896  DBGCP_HDA ( imux, 0, hdr, len );
897  switch ( hdr->protocol ) {
898  case htonl ( IMUX_VERSION ):
899  imux_rx_version ( imux );
900  break;
901  case htonl ( IMUX_LOG ):
902  imux_rx_log ( imux, hdr, len );
903  break;
904  case htonl ( IMUX_TCP ):
905  imux_rx_tcp ( imux, iob_disown ( iobuf ) );
906  break;
907  default:
908  DBGC ( imux, "IMUX %p unknown message type %d:\n",
909  imux, ntohl ( hdr->protocol ) );
910  DBGC_HDA ( imux, 0, hdr, len );
911  break;
912  }
913 
914  drop:
915  free_iob ( iobuf );
916 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void imux_rx_log(struct imux *imux, struct imux_header *hdr, size_t len)
Receive log message.
Definition: iphone.c:759
An iPhone USB multiplexed packet header.
Definition: iphone.h:50
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
static void imux_rx_version(struct imux *imux)
Receive version message.
Definition: iphone.c:743
TCP packet.
Definition: iphone.h:70
#define DBGC(...)
Definition: compiler.h:505
#define ntohl(value)
Definition: byteswap.h:135
#define ntohs(value)
Definition: byteswap.h:137
int open
Endpoint is open.
Definition: usb.h:419
#define htonl(value)
Definition: byteswap.h:134
static void imux_rx_tcp(struct imux *imux, struct io_buffer *iobuf)
Receive pseudo-TCP message.
Definition: iphone.c:809
Log message.
Definition: iphone.h:68
#define DBGCP_HDA(...)
Definition: compiler.h:540
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
#define DBGC_HDA(...)
Definition: compiler.h:506
ring len
Length.
Definition: dwmac.h:231
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
struct usb_endpoint in
Bulk IN endpoint.
Definition: usbnet.h:30
uint16_t in_seq
Input sequence.
Definition: iphone.h:137
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:123
Version number.
Definition: iphone.h:66
void * data
Start of data.
Definition: iobuf.h:53
#define DBGCP(...)
Definition: compiler.h:539

References container_of, io_buffer::data, DBGC, DBGC_HDA, DBGCP, DBGCP_HDA, free_iob(), hdr, htonl, IMUX_LOG, imux_rx_log(), imux_rx_tcp(), imux_rx_version(), IMUX_TCP, IMUX_VERSION, usbnet_device::in, imux::in_seq, iob_disown, iob_len(), len, ntohl, ntohs, usb_endpoint::open, rc, strerror(), and imux::usbnet.

◆ imux_out_complete()

static void imux_out_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete bulk OUT transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 930 of file iphone.c.

931  {
932  struct imux *imux = container_of ( ep, struct imux, usbnet.out );
933 
934  /* Report USB errors */
935  if ( rc != 0 ) {
936  DBGC ( imux, "IMUX %p bulk OUT failed: %s\n",
937  imux, strerror ( rc ) );
938  goto error;
939  }
940 
941  error:
942  free_iob ( iobuf );
943 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
struct arbelprm_completion_with_error error
Definition: arbel.h:12
#define DBGC(...)
Definition: compiler.h:505
struct usb_endpoint out
Bulk OUT endpoint.
Definition: usbnet.h:32
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:123

References container_of, DBGC, error, free_iob(), usbnet_device::out, rc, strerror(), and imux::usbnet.

◆ imux_shutdown()

static void imux_shutdown ( struct imux imux)
static

Shut down USB multiplexer.

Parameters
imuxUSB multiplexer

Definition at line 955 of file iphone.c.

955  {
956 
957  /* Shut down interfaces */
959 
960  /* Close USB network device, if open */
961  if ( process_running ( &imux->process ) ) {
962  process_del ( &imux->process );
963  usbnet_close ( &imux->usbnet );
964  }
965 }
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition: interface.c:279
struct interface tcp
Pseudo-TCP lockdown socket interface.
Definition: iphone.h:148
void process_del(struct process *process)
Remove process from process list.
Definition: process.c:80
#define ECANCELED
Operation canceled.
Definition: errno.h:344
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:123
static int process_running(struct process *process)
Check if process is running.
Definition: process.h:176
struct process process
Polling process.
Definition: iphone.h:128
void usbnet_close(struct usbnet_device *usbnet)
Close USB network device.
Definition: usbnet.c:128

References ECANCELED, intf_shutdown(), imux::process, process_del(), process_running(), imux::tcp, imux::usbnet, and usbnet_close().

Referenced by imux_close(), imux_probe(), and imux_remove().

◆ imux_close()

static void imux_close ( struct imux imux,
int  rc 
)
static

Close USB multiplexer.

Parameters
imuxUSB multiplexer
rcReason for close

Definition at line 973 of file iphone.c.

973  {
974  struct iphone *iphone;
975 
976  /* Restart interfaces */
977  intf_restart ( &imux->tcp, rc );
978 
979  /* Record pairing status */
980  imux->rc = rc;
981 
982  /* Trigger link check on any associated iPhones */
983  list_for_each_entry ( iphone, &iphones, list ) {
984  if ( iphone->usb == imux->usb )
986  }
987 
988  /* Retry pairing on any error */
989  if ( rc != 0 ) {
990 
991  /* Increment port number */
992  imux->port++;
993 
994  /* Request pairing on any retry attempt */
996 
997  /* Send new pseudo-TCP SYN */
999 
1000  DBGC ( imux, "IMUX %p retrying pairing: %s\n",
1001  imux, strerror ( rc ) );
1002  return;
1003  }
1004 
1005  /* Shut down multiplexer on pairing success */
1006  imux_shutdown ( imux );
1007 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_restart(struct interface *intf, int rc)
Shut down and restart an object interface.
Definition: interface.c:344
static int imux_tx_syn(struct imux *imux)
Transmit pseudo-TCP SYN.
Definition: iphone.c:694
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:100
int(* action)(struct imux *imux)
Pending action.
Definition: iphone.h:134
struct interface tcp
Pseudo-TCP lockdown socket interface.
Definition: iphone.h:148
#define DBGC(...)
Definition: compiler.h:505
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:432
Request a new pairing.
Definition: iphone.h:214
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
struct usb_device * usb
USB device.
Definition: iphone.h:257
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usb_device * usb
USB device.
Definition: iphone.h:119
unsigned int flags
Pairing flags.
Definition: iphone.h:150
An iPhone network device.
Definition: iphone.h:255
uint16_t port
Pseudo-TCP local port number.
Definition: iphone.h:145
struct retry_timer timer
Link status check timer.
Definition: iphone.h:268
static void imux_shutdown(struct imux *imux)
Shut down USB multiplexer.
Definition: iphone.c:955
int rc
Pairing status.
Definition: iphone.h:152
struct list_head list
List of iPhone network devices.
Definition: iphone.h:266

References imux::action, DBGC, imux::flags, imux_shutdown(), imux_tx_syn(), intf_restart(), IPAIR_REQUEST, iphone::list, list_for_each_entry, imux::port, imux::rc, rc, start_timer_nodelay(), strerror(), imux::tcp, iphone::timer, imux::usb, and iphone::usb.

Referenced by imux_step().

◆ imux_alloc_iob()

static struct io_buffer* imux_alloc_iob ( struct imux *imux  __unused,
size_t  len 
)
static

Allocate I/O buffer for pseudo-TCP socket.

Parameters
imuxUSB multiplexer
lenI/O buffer payload length
Return values
iobufI/O buffer

Definition at line 1016 of file iphone.c.

1017  {
1018  struct imux_header_tcp *tcp;
1019  struct io_buffer *iobuf;
1020 
1021  /* Allocate I/O buffer */
1022  iobuf = alloc_iob ( sizeof ( *tcp ) + len );
1023  if ( ! iobuf )
1024  return NULL;
1025 
1026  /* Reserve space for pseudo-TCP message header */
1027  iob_reserve ( iobuf, sizeof ( *tcp ) );
1028 
1029  return iobuf;
1030 }
An iPhone USB multiplexed pseudo-TCP message header.
Definition: iphone.h:92
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:131
struct tcp_header tcp
Pseudo-TCP header.
Definition: iphone.h:96
ring len
Length.
Definition: dwmac.h:231
#define iob_reserve(iobuf, len)
Definition: iobuf.h:72
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
A persistent I/O buffer.
Definition: iobuf.h:38

References alloc_iob(), iob_reserve, len, NULL, and imux_header_tcp::tcp.

◆ imux_deliver()

static int imux_deliver ( struct imux imux,
struct io_buffer iobuf,
struct xfer_metadata *meta  __unused 
)
static

Transmit packet via pseudo-TCP socket.

Parameters
imuxUSB multiplexer
iobufI/O buffer
metaData transfer metadata
Return values
rcReturn status code

Definition at line 1040 of file iphone.c.

1041  {
1042  struct imux_header_tcp *tcp;
1043 
1044  /* Prepend pseudo-TCP header */
1045  tcp = iob_push ( iobuf, sizeof ( *tcp ) );
1046  memset ( tcp, 0, sizeof ( *tcp ) );
1047  tcp->tcp.flags = TCP_ACK;
1048 
1049  /* Transmit pseudo-TCP packet */
1050  return imux_tx_tcp ( imux, iob_disown ( iobuf ) );
1051 }
#define TCP_ACK
Definition: tcp.h:160
#define iob_push(iobuf, len)
Definition: iobuf.h:89
uint8_t flags
Definition: tcp.h:26
An iPhone USB multiplexed pseudo-TCP message header.
Definition: iphone.h:92
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
struct tcp_header tcp
Pseudo-TCP header.
Definition: iphone.h:96
An iPhone USB multiplexer.
Definition: iphone.h:115
static int imux_tx_tcp(struct imux *imux, struct io_buffer *iobuf)
Transmit pseudo-TCP message.
Definition: iphone.c:663
void * memset(void *dest, int character, size_t len) __nonnull

References tcp_header::flags, imux_tx_tcp(), iob_disown, iob_push, memset(), imux_header_tcp::tcp, and TCP_ACK.

◆ imux_step()

static void imux_step ( struct imux imux)
static

Multiplexer process.

Parameters
imuxUSB multiplexer

Definition at line 1069 of file iphone.c.

1069  {
1070  int rc;
1071 
1072  /* Poll USB bus */
1073  usb_poll ( imux->bus );
1074 
1075  /* Do nothing more if multiplexer has been closed */
1076  if ( ! process_running ( &imux->process ) )
1077  return;
1078 
1079  /* Refill endpoints */
1080  if ( ( rc = usbnet_refill ( &imux->usbnet ) ) != 0 ) {
1081  /* Wait for next poll */
1082  return;
1083  }
1084 
1085  /* Perform pending action, if any */
1086  if ( imux->action ) {
1087  if ( ( rc = imux->action ( imux ) ) != 0 )
1088  imux_close ( imux, rc );
1089  imux->action = NULL;
1090  }
1091 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int(* action)(struct imux *imux)
Pending action.
Definition: iphone.h:134
int usbnet_refill(struct usbnet_device *usbnet)
Refill USB network device bulk IN and interrupt endpoints.
Definition: usbnet.c:152
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition: usb.h:1072
struct usb_bus * bus
USB bus.
Definition: iphone.h:121
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:123
static int process_running(struct process *process)
Check if process is running.
Definition: process.h:176
static void imux_close(struct imux *imux, int rc)
Close USB multiplexer.
Definition: iphone.c:973
struct process process
Polling process.
Definition: iphone.h:128
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References imux::action, imux::bus, imux_close(), NULL, imux::process, process_running(), rc, usb_poll(), imux::usbnet, and usbnet_refill().

◆ imux_probe()

static int imux_probe ( struct usb_function func,
struct usb_configuration_descriptor config 
)
static

Probe device.

Parameters
funcUSB function
configConfiguration descriptor
Return values
rcReturn status code

Definition at line 1104 of file iphone.c.

1105  {
1106  struct usb_device *usb = func->usb;
1107  struct imux *imux;
1108  int rc;
1109 
1110  /* Allocate and initialise structure */
1111  imux = zalloc ( sizeof ( *imux ) );
1112  if ( ! imux ) {
1113  rc = -ENOMEM;
1114  goto err_alloc;
1115  }
1116  ref_init ( &imux->refcnt, NULL );
1117  imux->usb = usb;
1118  imux->bus = usb->port->hub->bus;
1127 
1128  /* Describe USB network device */
1129  if ( ( rc = usbnet_describe ( &imux->usbnet, config ) ) != 0 ) {
1130  DBGC ( imux, "IMUX %p could not describe: %s\n",
1131  imux, strerror ( rc ) );
1132  goto err_describe;
1133  }
1134 
1135  /* Open USB network device */
1136  if ( ( rc = usbnet_open ( &imux->usbnet ) ) != 0 ) {
1137  DBGC ( imux, "IMUX %p could not open: %s\n",
1138  imux, strerror ( rc ) );
1139  goto err_open;
1140  }
1141 
1142  /* Start polling process */
1143  process_add ( &imux->process );
1144 
1145  /* Add to list of multiplexers */
1146  list_add ( &imux->list, &imuxes );
1147 
1148  usb_func_set_drvdata ( func, imux );
1149  return 0;
1150 
1151  list_del ( &imux->list );
1152  imux_shutdown ( imux );
1153  err_open:
1154  err_describe:
1155  ref_put ( &imux->refcnt );
1156  err_alloc:
1157  return rc;
1158 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define IMUX_IN_MAX_FILL
Multiplexer bulk IN maximum fill level.
Definition: iphone.h:159
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:70
#define ref_init(refcnt, free)
Initialise a reference counter.
Definition: refcnt.h:65
int(* action)(struct imux *imux)
Pending action.
Definition: iphone.h:134
static void process_init(struct process *process, struct process_descriptor *desc, struct refcnt *refcnt)
Initialise process and add to process list.
Definition: process.h:162
struct interface tcp
Pseudo-TCP lockdown socket interface.
Definition: iphone.h:148
#define DBGC(...)
Definition: compiler.h:505
static struct usb_endpoint_driver_operations imux_out_operations
Bulk OUT endpoint operations.
Definition: iphone.c:946
#define IMUX_PORT_LOCAL
Local port number.
Definition: iphone.h:103
static struct interface_descriptor imux_tcp_desc
Pseudo-TCP socket interface descriptor.
Definition: iphone.c:1061
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
#define ENOMEM
Not enough space.
Definition: errno.h:535
#define EINPROGRESS_PAIRING
Definition: iphone.c:56
struct usb_port * port
USB port.
Definition: usb.h:727
static int imux_tx_version(struct imux *imux)
Transmit version message.
Definition: iphone.c:634
static void usb_refill_init(struct usb_endpoint *ep, size_t reserve, size_t len, unsigned int max)
Initialise USB endpoint refill.
Definition: usb.h:617
static void usb_func_set_drvdata(struct usb_function *func, void *priv)
Set USB function driver private data.
Definition: usb.h:707
A USB device.
Definition: usb.h:723
void process_add(struct process *process)
Add process to process list.
Definition: process.c:60
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
struct usb_endpoint in
Bulk IN endpoint.
Definition: usbnet.h:30
struct usb_bus * bus
USB bus.
Definition: iphone.h:121
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usb_device * usb
USB device.
Definition: usb.h:678
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:123
struct usb_device * usb
USB device.
Definition: iphone.h:119
struct process process
Polling process.
Definition: iphone.h:128
#define IMUX_IN_MTU
Multiplexer bulk IN buffer size.
Definition: iphone.h:165
static void usbnet_init(struct usbnet_device *usbnet, struct usb_function *func, struct usb_endpoint_driver_operations *intr, struct usb_endpoint_driver_operations *in, struct usb_endpoint_driver_operations *out)
Initialise USB network device.
Definition: usbnet.h:45
struct usb_hub * hub
USB hub.
Definition: usb.h:815
uint16_t port
Pseudo-TCP local port number.
Definition: iphone.h:145
struct refcnt refcnt
Reference counter.
Definition: iphone.h:117
int usbnet_describe(struct usbnet_device *usbnet, struct usb_configuration_descriptor *config)
Describe USB network device interfaces.
Definition: usbnet.c:278
static struct process_descriptor imux_process_desc
Multiplexer process descriptor.
Definition: iphone.c:1094
static void imux_shutdown(struct imux *imux)
Shut down USB multiplexer.
Definition: iphone.c:955
static struct usb_endpoint_driver_operations imux_in_operations
Bulk IN endpoint operations.
Definition: iphone.c:919
int rc
Pairing status.
Definition: iphone.h:152
static void intf_init(struct interface *intf, struct interface_descriptor *desc, struct refcnt *refcnt)
Initialise an object interface.
Definition: interface.h:204
struct usb_bus * bus
USB bus.
Definition: usb.h:845
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:107
struct list_head list
List of USB multiplexers.
Definition: iphone.h:125
int usbnet_open(struct usbnet_device *usbnet)
Open USB network device.
Definition: usbnet.c:55

References imux::action, imux::bus, usb_hub::bus, DBGC, EINPROGRESS_PAIRING, ENOMEM, usb_port::hub, IMUX_IN_MAX_FILL, IMUX_IN_MTU, imux_in_operations, imux_out_operations, IMUX_PORT_LOCAL, imux_process_desc, imux_shutdown(), imux_tcp_desc, imux_tx_version(), usbnet_device::in, intf_init(), imux::list, list_add, list_del, NULL, imux::port, usb_device::port, imux::process, process_add(), process_init(), imux::rc, rc, ref_init, ref_put, imux::refcnt, strerror(), imux::tcp, imux::usb, usb_function::usb, usb_func_set_drvdata(), usb_refill_init(), imux::usbnet, usbnet_describe(), usbnet_init(), usbnet_open(), and zalloc().

◆ imux_remove()

static void imux_remove ( struct usb_function func)
static

Remove device.

Parameters
funcUSB function

Definition at line 1165 of file iphone.c.

1165  {
1166  struct imux *imux = usb_func_get_drvdata ( func );
1167 
1168  list_del ( &imux->list );
1169  imux_shutdown ( imux );
1170  ref_put ( &imux->refcnt );
1171 }
static void * usb_func_get_drvdata(struct usb_function *func)
Get USB function driver private data.
Definition: usb.h:718
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
An iPhone USB multiplexer.
Definition: iphone.h:115
struct refcnt refcnt
Reference counter.
Definition: iphone.h:117
static void imux_shutdown(struct imux *imux)
Shut down USB multiplexer.
Definition: iphone.c:955
#define ref_put(refcnt)
Drop reference to object.
Definition: refcnt.h:107
struct list_head list
List of USB multiplexers.
Definition: iphone.h:125

References imux_shutdown(), imux::list, list_del, ref_put, imux::refcnt, and usb_func_get_drvdata().

◆ ipair_tx_pubkey()

static int ipair_tx_pubkey ( struct ipair ipair)
static

Transmit DevicePublicKey message.

Parameters
ipairPairing client
Return values
rcReturn status code

Definition at line 1412 of file iphone.c.

1412  {
1413  int rc;
1414 
1415  /* Transmit message */
1416  if ( ( rc = ipair_tx ( ipair,
1417  "%s"
1418  "<string>GetValue</string>\n"
1419  "<key>Key</key>\n"
1420  "<string>DevicePublicKey</string>\n"
1421  "%s",
1422  ipair_prefix, ipair_suffix ) ) != 0 )
1423  return rc;
1424 
1425  return 0;
1426 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int ipair_tx(struct ipair *ipair, const char *fmt,...)
Transmit XML message.
Definition: iphone.c:1264
static const char ipair_prefix[]
Common prefix for all pairing messages.
Definition: iphone.c:1200
An iPhone pairing client.
Definition: iphone.h:183
static const char ipair_suffix[]
Common suffix for all pairing messages.
Definition: iphone.c:1211

References ipair_prefix, ipair_suffix, ipair_tx(), and rc.

Referenced by ipair_create().

◆ ipair_rx_pubkey()

static int ipair_rx_pubkey ( struct ipair ipair,
char *  msg 
)
static

Receive DevicePublicKey message.

Parameters
ipairPairing client
msgXML message
Return values
rcReturn status code

Definition at line 1435 of file iphone.c.

1435  {
1436  struct asn1_cursor *key;
1437  char *data;
1438  char *end;
1439  char *decoded;
1440  size_t max_len;
1441  int len;
1442  int next;
1443  int rc;
1444 
1445  /* Locate "Value" value */
1446  if ( ( rc = ipair_key ( ipair, msg, "Value", "data", &data,
1447  &end ) ) != 0 ) {
1448  DBGC ( ipair, "IPAIR %p unexpected public key message:\n%s\n",
1449  ipair, msg );
1450  goto err_tag;
1451  }
1452  *end = '\0';
1453 
1454  /* Decode outer layer of Base64 */
1455  max_len = base64_decoded_max_len ( data );
1456  decoded = malloc ( max_len );
1457  if ( ! decoded ) {
1458  rc = -ENOMEM;
1459  goto err_alloc;
1460  }
1461  len = base64_decode ( data, decoded, max_len );
1462  if ( len < 0 ) {
1463  rc = len;
1464  DBGC ( ipair, "IPAIR %p invalid outer public key:\n%s\n",
1465  ipair, data );
1466  goto err_decode;
1467  }
1468 
1469  /* Decode inner layer of Base64 */
1470  next = pem_asn1 ( decoded, len, 0, &key );
1471  if ( next < 0 ) {
1472  rc = next;
1473  DBGC ( ipair, "IPAIR %p invalid inner public key:\n%s\n",
1474  ipair, decoded );
1475  goto err_asn1;
1476  }
1477  DBGC ( ipair, "IPAIR %p received public key\n", ipair );
1478  DBGC2_HDA ( ipair, 0, key->data, key->len );
1479 
1480  /* Construct certificates */
1481  if ( ( rc = icert_certs ( &ipair->icert, key ) ) != 0 )
1482  goto err_certs;
1483 
1484  /* Send session request or pair request as applicable */
1485  if ( ipair->flags & IPAIR_REQUEST ) {
1486  ipair->tx = ipair_tx_pair;
1487  ipair->rx = ipair_rx_pair;
1488  } else {
1491  }
1493 
1494  /* Free key */
1495  free ( key );
1496 
1497  /* Free intermediate Base64 */
1498  free ( decoded );
1499 
1500  return 0;
1501 
1502  err_certs:
1503  free ( key );
1504  err_asn1:
1505  err_decode:
1506  free ( decoded );
1507  err_alloc:
1508  err_tag:
1509  return rc;
1510 }
static int ipair_key(struct ipair *ipair, const char *msg, const char *key, const char *type, char **start, char **end)
Locate XML property list dictionary value.
Definition: iphone.c:1384
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int pem_asn1(const void *data, size_t len, size_t offset, struct asn1_cursor **cursor)
Extract ASN.1 object from PEM data.
Definition: pem.c:104
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:100
int(* tx)(struct ipair *ipair)
Transmit message.
Definition: iphone.h:196
static int ipair_rx_pair(struct ipair *ipair, char *msg)
Receive Pair message.
Definition: iphone.c:1607
#define DBGC(...)
Definition: compiler.h:505
int base64_decode(const char *encoded, void *data, size_t len)
Base64-decode string.
Definition: base64.c:92
static int ipair_rx_session(struct ipair *ipair, char *msg)
Receive StartSession message.
Definition: iphone.c:1694
static int icert_certs(struct icert *icert, struct asn1_cursor *key)
Construct certificates.
Definition: iphone.c:448
An iPhone pairing client.
Definition: iphone.h:183
#define ENOMEM
Not enough space.
Definition: errno.h:535
static size_t base64_decoded_max_len(const char *encoded)
Calculate maximum length of base64-decoded string.
Definition: base64.h:35
ring len
Length.
Definition: dwmac.h:231
#define DBGC2_HDA(...)
Definition: compiler.h:523
Request a new pairing.
Definition: iphone.h:214
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:621
struct icert icert
Pairing certificates.
Definition: iphone.h:208
static int ipair_tx_session(struct ipair *ipair)
Transmit StartSession message.
Definition: iphone.c:1643
static int ipair_tx_pair(struct ipair *ipair)
Transmit Pair message.
Definition: iphone.c:1518
uint32_t end
Ending offset.
Definition: netvsc.h:18
uint8_t data[48]
Additional event data.
Definition: ena.h:22
int(* rx)(struct ipair *ipair, char *msg)
Receive message.
Definition: iphone.h:203
unsigned int flags
State flags.
Definition: iphone.h:205
An ASN.1 object cursor.
Definition: asn1.h:21
union @391 key
Sense key.
Definition: scsi.h:18
struct retry_timer timer
Pairing timer.
Definition: iphone.h:190

References base64_decode(), base64_decoded_max_len(), data, DBGC, DBGC2_HDA, end, ENOMEM, ipair::flags, free, ipair::icert, icert_certs(), ipair_key(), IPAIR_REQUEST, ipair_rx_pair(), ipair_rx_session(), ipair_tx_pair(), ipair_tx_session(), key, len, malloc(), msg(), next, pem_asn1(), rc, ipair::rx, start_timer_nodelay(), ipair::timer, and ipair::tx.

Referenced by ipair_create().

◆ ipair_tx_pair()

static int ipair_tx_pair ( struct ipair ipair)
static

Transmit Pair message.

Parameters
ipairPairing client
Return values
rcReturn status code

Definition at line 1518 of file iphone.c.

1518  {
1519  char *root;
1520  char *host;
1521  char *device;
1522  int rc;
1523 
1524  /* Construct doubly encoded certificates */
1525  if ( ( rc = icert_encode ( &ipair->icert, ipair->icert.root,
1526  &root ) ) != 0 )
1527  goto err_root;
1528  if ( ( rc = icert_encode ( &ipair->icert, ipair->icert.host,
1529  &host ) ) != 0 )
1530  goto err_host;
1531  if ( ( rc = icert_encode ( &ipair->icert, ipair->icert.device,
1532  &device ) ) != 0 )
1533  goto err_device;
1534 
1535  /* Transmit message */
1536  if ( ( rc = ipair_tx ( ipair,
1537  "%s"
1538  "<string>Pair</string>\n"
1539  "<key>PairRecord</key>\n"
1540  "<dict>\n"
1541  "<key>RootCertificate</key>\n"
1542  "<data>%s</data>\n"
1543  "<key>HostCertificate</key>\n"
1544  "<data>%s</data>\n"
1545  "<key>DeviceCertificate</key>\n"
1546  "<data>%s</data>\n"
1547  "<key>SystemBUID</key>\n"
1548  "<string>%s</string>\n"
1549  "<key>HostID</key>\n"
1550  "<string>%s</string>\n"
1551  "</dict>\n"
1552  "<key>ProtocolVersion</key>\n"
1553  "<string>2</string>\n"
1554  "<key>PairingOptions</key>\n"
1555  "<dict>\n"
1556  "<key>ExtendedPairingErrors</key>\n"
1557  "<true/>\n"
1558  "</dict>\n"
1559  "%s",
1560  ipair_prefix, root, host, device,
1562  ipair_suffix
1563  ) ) != 0 )
1564  goto err_tx;
1565 
1566  err_tx:
1567  free ( device );
1568  err_device:
1569  free ( host );
1570  err_host:
1571  free ( root );
1572  err_root:
1573  return rc;
1574 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct stp_switch root
Root switch.
Definition: stp.h:27
static int ipair_tx(struct ipair *ipair, const char *fmt,...)
Transmit XML message.
Definition: iphone.c:1264
static const char ipair_prefix[]
Common prefix for all pairing messages.
Definition: iphone.c:1200
static const char ipair_host_id[]
Arbitrary host ID used for pairing.
Definition: iphone.c:1219
struct x509_certificate * device
Device certificate.
Definition: iphone.h:39
uint16_t device
Device ID.
Definition: ena.h:24
An iPhone pairing client.
Definition: iphone.h:183
struct x509_certificate * host
Host certificate.
Definition: iphone.h:37
A hardware device.
Definition: device.h:77
static int icert_encode(struct icert *icert, struct x509_certificate *cert, char **encenc)
Construct doubly base64-encoded certificate.
Definition: iphone.c:531
static const char ipair_system_buid[]
Arbitrary system BUID used for pairing.
Definition: iphone.c:1216
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
struct x509_certificate * root
Root certificate.
Definition: iphone.h:35
static const char ipair_suffix[]
Common suffix for all pairing messages.
Definition: iphone.c:1211
struct icert icert
Pairing certificates.
Definition: iphone.h:208

References device, icert::device, free, icert::host, ipair::icert, icert_encode(), ipair_host_id, ipair_prefix, ipair_suffix, ipair_system_buid, ipair_tx(), rc, root, and icert::root.

Referenced by ipair_rx_pair_error(), ipair_rx_pubkey(), and ipair_rx_session_error().

◆ ipair_rx_pair()

static int ipair_rx_pair ( struct ipair ipair,
char *  msg 
)
static

Receive Pair message.

Parameters
ipairPairing client
msgXML message
Return values
rcReturn status code

Definition at line 1607 of file iphone.c.

1607  {
1608  char *error;
1609  char *escrow;
1610  char *end;
1611  int rc;
1612 
1613  /* Check for pairing errors */
1614  if ( ( rc = ipair_key ( ipair, msg, "Error", "string", &error,
1615  &end ) ) == 0 ) {
1616  *end = '\0';
1617  return ipair_rx_pair_error ( ipair, error );
1618  }
1619 
1620  /* Get EscrowBag */
1621  if ( ( rc = ipair_key ( ipair, msg, "EscrowBag", "data", &escrow,
1622  &end ) ) != 0 ) {
1623  DBGC ( ipair, "IPAIR %p unexpected pairing response:\n%s\n",
1624  ipair, msg );
1625  return rc;
1626  }
1627  DBGC ( ipair, "IPAIR %p pairing successful\n", ipair );
1628 
1629  /* Send session request */
1633 
1634  return 0;
1635 }
static int ipair_key(struct ipair *ipair, const char *msg, const char *key, const char *type, char **start, char **end)
Locate XML property list dictionary value.
Definition: iphone.c:1384
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:100
int(* tx)(struct ipair *ipair)
Transmit message.
Definition: iphone.h:196
struct arbelprm_completion_with_error error
Definition: arbel.h:12
#define DBGC(...)
Definition: compiler.h:505
static int ipair_rx_session(struct ipair *ipair, char *msg)
Receive StartSession message.
Definition: iphone.c:1694
An iPhone pairing client.
Definition: iphone.h:183
static int ipair_tx_session(struct ipair *ipair)
Transmit StartSession message.
Definition: iphone.c:1643
uint32_t end
Ending offset.
Definition: netvsc.h:18
int(* rx)(struct ipair *ipair, char *msg)
Receive message.
Definition: iphone.h:203
static int ipair_rx_pair_error(struct ipair *ipair, char *error)
Receive Pair message error.
Definition: iphone.c:1583
struct retry_timer timer
Pairing timer.
Definition: iphone.h:190

References DBGC, end, error, ipair_key(), ipair_rx_pair_error(), ipair_rx_session(), ipair_tx_session(), msg(), rc, ipair::rx, start_timer_nodelay(), ipair::timer, and ipair::tx.

Referenced by ipair_rx_pair_error(), ipair_rx_pubkey(), and ipair_rx_session_error().

◆ ipair_tx_session()

static int ipair_tx_session ( struct ipair ipair)
static

Transmit StartSession message.

Parameters
ipairPairing client
Return values
rcReturn status code

Definition at line 1643 of file iphone.c.

1643  {
1644  int rc;
1645 
1646  /* Transmit message */
1647  if ( ( rc = ipair_tx ( ipair,
1648  "%s"
1649  "<string>StartSession</string>\n"
1650  "<key>SystemBUID</key>\n"
1651  "<string>%s</string>\n"
1652  "<key>HostID</key>\n"
1653  "<string>%s</string>\n"
1654  "%s",
1657  ) ) != 0 )
1658  return rc;
1659 
1660  return 0;
1661 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int ipair_tx(struct ipair *ipair, const char *fmt,...)
Transmit XML message.
Definition: iphone.c:1264
static const char ipair_prefix[]
Common prefix for all pairing messages.
Definition: iphone.c:1200
static const char ipair_host_id[]
Arbitrary host ID used for pairing.
Definition: iphone.c:1219
An iPhone pairing client.
Definition: iphone.h:183
static const char ipair_system_buid[]
Arbitrary system BUID used for pairing.
Definition: iphone.c:1216
static const char ipair_suffix[]
Common suffix for all pairing messages.
Definition: iphone.c:1211

References ipair_host_id, ipair_prefix, ipair_suffix, ipair_system_buid, ipair_tx(), and rc.

Referenced by ipair_rx_pair(), and ipair_rx_pubkey().

◆ ipair_rx_session()

static int ipair_rx_session ( struct ipair ipair,
char *  msg 
)
static

Receive StartSession message.

Parameters
ipairPairing client
msgXML message
Return values
rcReturn status code

Definition at line 1694 of file iphone.c.

1694  {
1695  char *error;
1696  char *session;
1697  char *end;
1698  int rc;
1699 
1700  /* Check for session errors */
1701  if ( ( rc = ipair_key ( ipair, msg, "Error", "string", &error,
1702  &end ) ) == 0 ) {
1703  *end = '\0';
1704  return ipair_rx_session_error ( ipair, error );
1705  }
1706 
1707  /* Check for session ID */
1708  if ( ( rc = ipair_key ( ipair, msg, "SessionID", "string", &session,
1709  &end ) ) != 0 ) {
1710  DBGC ( ipair, "IPAIR %p unexpected session response:\n%s\n",
1711  ipair, msg );
1712  return rc;
1713  }
1714  *end = '\0';
1715  DBGC ( ipair, "IPAIR %p starting session \"%s\"\n", ipair, session );
1716 
1717  /* Start TLS */
1718  if ( ( rc = add_tls ( &ipair->xfer, "iPhone", &icert_root,
1719  ipair->icert.key ) ) != 0 ) {
1720  DBGC ( ipair, "IPAIR %p could not start TLS: %s\n",
1721  ipair, strerror ( rc ) );
1722  return rc;
1723  }
1724 
1725  /* Record that TLS has been started */
1726  ipair->flags |= IPAIR_TLS;
1727 
1728  return 0;
1729 }
static int ipair_key(struct ipair *ipair, const char *msg, const char *key, const char *type, char **start, char **end)
Locate XML property list dictionary value.
Definition: iphone.c:1384
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
struct arbelprm_completion_with_error error
Definition: arbel.h:12
static struct x509_root icert_root
Root of trust for iPhone certificates.
Definition: iphone.c:95
#define DBGC(...)
Definition: compiler.h:505
struct interface xfer
Data transfer interface.
Definition: iphone.h:187
static int ipair_rx_session_error(struct ipair *ipair, char *error)
Receive StartSession message error.
Definition: iphone.c:1670
An iPhone pairing client.
Definition: iphone.h:183
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
struct icert icert
Pairing certificates.
Definition: iphone.h:208
struct private_key * key
"Private" key
Definition: iphone.h:33
uint32_t end
Ending offset.
Definition: netvsc.h:18
TLS session has been started.
Definition: iphone.h:218
unsigned int flags
State flags.
Definition: iphone.h:205
int add_tls(struct interface *xfer, const char *name, struct x509_root *root, struct private_key *key)
Add TLS on an interface.
Definition: tls.c:3962

References add_tls(), DBGC, end, error, ipair::flags, ipair::icert, icert_root, ipair_key(), ipair_rx_session_error(), IPAIR_TLS, icert::key, msg(), rc, strerror(), and ipair::xfer.

Referenced by ipair_rx_pair(), and ipair_rx_pubkey().

◆ ipair_free()

static void ipair_free ( struct refcnt refcnt)
static

Free pairing client.

Parameters
refcntReference counter

Definition at line 1233 of file iphone.c.

1233  {
1234  struct ipair *ipair = container_of ( refcnt, struct ipair, refcnt );
1235 
1236  icert_free ( &ipair->icert );
1237  free ( ipair );
1238 }
An iPhone pairing client.
Definition: iphone.h:183
A reference counter.
Definition: refcnt.h:27
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
struct icert icert
Pairing certificates.
Definition: iphone.h:208
static void icert_free(struct icert *icert)
Free pairing certificates.
Definition: iphone.c:331

References container_of, free, ipair::icert, and icert_free().

Referenced by ipair_create().

◆ ipair_close()

static void ipair_close ( struct ipair ipair,
int  rc 
)
static

Shut down pairing client.

Parameters
ipairPairing client
rcReason for close

Definition at line 1246 of file iphone.c.

1246  {
1247 
1248  /* Shut down interfaces */
1249  intf_shutdown ( &ipair->xfer, rc );
1250 
1251  /* Stop timer */
1252  stop_timer ( &ipair->timer );
1253 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void intf_shutdown(struct interface *intf, int rc)
Shut down an object interface.
Definition: interface.c:279
struct interface xfer
Data transfer interface.
Definition: iphone.h:187
An iPhone pairing client.
Definition: iphone.h:183
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:118
struct retry_timer timer
Pairing timer.
Definition: iphone.h:190

References intf_shutdown(), rc, stop_timer(), ipair::timer, and ipair::xfer.

Referenced by ipair_deliver(), ipair_expired(), and ipair_window_changed().

◆ ipair_tx()

static int ipair_tx ( struct ipair ipair,
const char *  fmt,
  ... 
)
static

Transmit XML message.

Parameters
ipairPairing client
fmtFormat string
...Arguments
Return values
rcReturn status code

Definition at line 1264 of file iphone.c.

1264  {
1265  struct io_buffer *iobuf;
1266  struct ipair_header *hdr;
1267  va_list args;
1268  size_t len;
1269  char *msg;
1270  int rc;
1271 
1272  /* Calculate length of formatted string */
1273  va_start ( args, fmt );
1274  len = ( vsnprintf ( NULL, 0, fmt, args ) + 1 /* NUL */ );
1275  va_end ( args );
1276 
1277  /* Allocate I/O buffer */
1278  iobuf = xfer_alloc_iob ( &ipair->xfer, ( sizeof ( *hdr ) + len ) );
1279  if ( ! iobuf )
1280  return -ENOMEM;
1281  hdr = iob_put ( iobuf, sizeof ( *hdr ) );
1282 
1283  /* Construct XML message */
1284  memset ( hdr, 0, sizeof ( *hdr ) );
1285  hdr->len = htonl ( len );
1286  msg = iob_put ( iobuf, len );
1287  va_start ( args, fmt );
1288  vsnprintf ( msg, len, fmt, args );
1289  va_end ( args );
1290  DBGC2 ( ipair, "IPAIR %p transmitting:\n%s\n", ipair, msg );
1291 
1292  /* Transmit message */
1293  if ( ( rc = xfer_deliver_iob ( &ipair->xfer,
1294  iob_disown ( iobuf ) ) ) != 0 )
1295  return rc;
1296 
1297  return 0;
1298 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:125
#define va_end(ap)
Definition: stdarg.h:10
int xfer_deliver_iob(struct interface *intf, struct io_buffer *iobuf)
Deliver datagram as I/O buffer without metadata.
Definition: xfer.c:256
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
struct interface xfer
Data transfer interface.
Definition: iphone.h:187
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:159
#define htonl(value)
Definition: byteswap.h:134
An iPhone pairing client.
Definition: iphone.h:183
#define ENOMEM
Not enough space.
Definition: errno.h:535
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
ring len
Length.
Definition: dwmac.h:231
#define DBGC2(...)
Definition: compiler.h:522
__builtin_va_list va_list
Definition: stdarg.h:7
int ssize_t const char * fmt
Definition: vsprintf.h:73
An iPhone USB multiplexed pseudo-TCP XML message header.
Definition: iphone.h:175
#define va_start(ap, last)
Definition: stdarg.h:8
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
Write a formatted string to a buffer.
Definition: vsprintf.c:352
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:38

References DBGC2, ENOMEM, fmt, hdr, htonl, iob_disown, iob_put, len, memset(), msg(), NULL, rc, va_end, va_start, vsnprintf(), ipair::xfer, xfer_alloc_iob(), and xfer_deliver_iob().

Referenced by ipair_tx_pair(), ipair_tx_pubkey(), and ipair_tx_session().

◆ ipair_rx()

static int ipair_rx ( struct ipair ipair,
char *  msg,
size_t  len 
)
static

Receive XML message payload.

Parameters
ipairPairing client
msgMessage payload
lenLength of message
Return values
rcReturn status code

Definition at line 1308 of file iphone.c.

1308  {
1309  int ( * rx ) ( struct ipair *ipair, char *msg );
1310  int rc;
1311 
1312  /* Ignore empty messages */
1313  if ( ! len )
1314  return 0;
1315 
1316  /* Sanity check */
1317  if ( ( msg[ len - 1 ] != '\0' ) && ( msg[ len - 1 ] != '\n' ) ) {
1318  DBGC ( ipair, "IPAIR %p malformed XML:\n", ipair );
1319  DBGC_HDA ( ipair, 0, msg, len );
1320  return -EPROTO;
1321  }
1322 
1323  /* Add NUL terminator (potentially overwriting final newline) */
1324  msg[ len - 1 ] = '\0';
1325  DBGC2 ( ipair, "IPAIR %p received:\n%s\n\n", ipair, msg );
1326 
1327  /* Handle according to current state */
1328  rx = ipair->rx;
1329  if ( ! rx ) {
1330  DBGC ( ipair, "IPAIR %p unexpected XML:\n%s\n", ipair, msg );
1331  return -EPROTO;
1332  }
1333  ipair->rx = NULL;
1334  if ( ( rc = rx ( ipair, msg ) ) != 0 )
1335  return rc;
1336 
1337  return 0;
1338 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
#define DBGC(...)
Definition: compiler.h:505
An iPhone pairing client.
Definition: iphone.h:183
#define DBGC_HDA(...)
Definition: compiler.h:506
ring len
Length.
Definition: dwmac.h:231
#define EPROTO
Protocol error.
Definition: errno.h:625
#define DBGC2(...)
Definition: compiler.h:522
u8 rx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets from the AP.
Definition: wpa.h:234
int(* rx)(struct ipair *ipair, char *msg)
Receive message.
Definition: iphone.h:203
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References DBGC, DBGC2, DBGC_HDA, EPROTO, len, msg(), NULL, rc, ipair::rx, and rx.

Referenced by ipair_deliver().

◆ ipair_tag()

static int ipair_tag ( struct ipair ipair,
const char *  msg,
const char *  tag,
char **  start,
char **  end 
)
static

Locate XML tag.

Parameters
ipairPairing client
msgXML message
tagTag name
Return values
startStart of tag content
endEnd of tag content
rcReturn status code

Definition at line 1350 of file iphone.c.

1351  {
1352  char buf[ 2 /* "</" */ + strlen ( tag ) + 1 /* ">" */ + 1 /* NUL */ ];
1353 
1354  /* Locate opening tag */
1355  sprintf ( buf, "<%s>", tag );
1356  *start = strstr ( msg, buf );
1357  if ( ! *start )
1358  return -ENOENT;
1359  *start += strlen ( buf );
1360 
1361  /* Locate closing tag */
1362  sprintf ( buf, "</%s>", tag );
1363  *end = strstr ( *start, buf );
1364  if ( ! *end ) {
1365  DBGC ( ipair, "IPAIR %p missing closing tag %s in:\n%s\n",
1366  ipair, buf, msg );
1367  return -ENOENT;
1368  }
1369 
1370  return 0;
1371 }
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
#define sprintf(buf, fmt,...)
Write a formatted string to a buffer.
Definition: stdio.h:37
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:515
An iPhone pairing client.
Definition: iphone.h:183
uint32_t start
Starting offset.
Definition: netvsc.h:12
char * strstr(const char *haystack, const char *needle)
Find substring.
Definition: string.c:310
size_t strlen(const char *src)
Get length of string.
Definition: string.c:244
uint32_t end
Ending offset.
Definition: netvsc.h:18
uint64_t tag
Identity tag.
Definition: edd.h:31

References DBGC, end, ENOENT, msg(), sprintf, start, strlen(), strstr(), and tag.

Referenced by ipair_key().

◆ ipair_key()

static int ipair_key ( struct ipair ipair,
const char *  msg,
const char *  key,
const char *  type,
char **  start,
char **  end 
)
static

Locate XML property list dictionary value.

Parameters
ipairPairing client
msgXML message
keyKey name
typeKey type
Return values
startStart of value content
endEnd of value content
rcReturn status code

Definition at line 1384 of file iphone.c.

1385  {
1386  int rc;
1387 
1388  /* Iterate over keys */
1389  while ( 1 ) {
1390 
1391  /* Locate key */
1392  if ( ( rc = ipair_tag ( ipair, msg, "key", start,
1393  end ) ) != 0 )
1394  return rc;
1395  msg = *end;
1396 
1397  /* Check key name */
1398  if ( memcmp ( *start, key, ( *end - *start ) ) != 0 )
1399  continue;
1400 
1401  /* Locate value */
1402  return ipair_tag ( ipair, msg, type, start, end );
1403  }
1404 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void msg(unsigned int row, const char *fmt,...)
Print message centred on specified row.
Definition: message.c:62
uint32_t type
Operating system type.
Definition: ena.h:12
An iPhone pairing client.
Definition: iphone.h:183
uint32_t start
Starting offset.
Definition: netvsc.h:12
static int ipair_tag(struct ipair *ipair, const char *msg, const char *tag, char **start, char **end)
Locate XML tag.
Definition: iphone.c:1350
uint32_t end
Ending offset.
Definition: netvsc.h:18
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:115
union @391 key
Sense key.
Definition: scsi.h:18

References end, ipair_tag(), key, memcmp(), msg(), rc, start, and type.

Referenced by ipair_rx_pair(), ipair_rx_pubkey(), and ipair_rx_session().

◆ ipair_rx_pair_error()

static int ipair_rx_pair_error ( struct ipair ipair,
char *  error 
)
static

Receive Pair message error.

Parameters
ipairPairing client
errorPairing error
Return values
rcReturn status code

Definition at line 1583 of file iphone.c.

1583  {
1584 
1585  /* Check for actual errors */
1586  if ( strcmp ( error, "PairingDialogResponsePending" ) != 0 ) {
1587  DBGC ( ipair, "IPAIR %p pairing error \"%s\"\n", ipair, error );
1588  return -EPERM;
1589  }
1590 
1591  /* Retransmit pairing request */
1592  ipair->tx = ipair_tx_pair;
1593  ipair->rx = ipair_rx_pair;
1595 
1596  DBGC ( ipair, "IPAIR %p waiting for pairing dialog\n", ipair );
1597  return 0;
1598 }
int(* tx)(struct ipair *ipair)
Transmit message.
Definition: iphone.h:196
struct arbelprm_completion_with_error error
Definition: arbel.h:12
static int ipair_rx_pair(struct ipair *ipair, char *msg)
Receive Pair message.
Definition: iphone.c:1607
#define DBGC(...)
Definition: compiler.h:505
An iPhone pairing client.
Definition: iphone.h:183
#define EPERM
Operation not permitted.
Definition: errno.h:615
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:65
#define IPAIR_RETRY_DELAY
Pairing retry delay.
Definition: iphone.h:225
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:174
static int ipair_tx_pair(struct ipair *ipair)
Transmit Pair message.
Definition: iphone.c:1518
int(* rx)(struct ipair *ipair, char *msg)
Receive message.
Definition: iphone.h:203
struct retry_timer timer
Pairing timer.
Definition: iphone.h:190

References DBGC, EPERM, error, IPAIR_RETRY_DELAY, ipair_rx_pair(), ipair_tx_pair(), ipair::rx, start_timer_fixed(), strcmp(), ipair::timer, and ipair::tx.

Referenced by ipair_rx_pair().

◆ ipair_rx_session_error()

static int ipair_rx_session_error ( struct ipair ipair,
char *  error 
)
static

Receive StartSession message error.

Parameters
ipairPairing client
errorPairing error
Return values
rcReturn status code

Definition at line 1670 of file iphone.c.

1670  {
1671 
1672  /* Check for actual errors */
1673  if ( strcmp ( error, "InvalidHostID" ) != 0 ) {
1674  DBGC ( ipair, "IPAIR %p session error \"%s\"\n", ipair, error );
1675  return -EPERM;
1676  }
1677 
1678  /* Transmit pairing request */
1679  ipair->tx = ipair_tx_pair;
1680  ipair->rx = ipair_rx_pair;
1682 
1683  DBGC ( ipair, "IPAIR %p unknown host: requesting pairing\n", ipair );
1684  return 0;
1685 }
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:100
int(* tx)(struct ipair *ipair)
Transmit message.
Definition: iphone.h:196
struct arbelprm_completion_with_error error
Definition: arbel.h:12
static int ipair_rx_pair(struct ipair *ipair, char *msg)
Receive Pair message.
Definition: iphone.c:1607
#define DBGC(...)
Definition: compiler.h:505
An iPhone pairing client.
Definition: iphone.h:183
#define EPERM
Operation not permitted.
Definition: errno.h:615
int strcmp(const char *first, const char *second)
Compare strings.
Definition: string.c:174
static int ipair_tx_pair(struct ipair *ipair)
Transmit Pair message.
Definition: iphone.c:1518
int(* rx)(struct ipair *ipair, char *msg)
Receive message.
Definition: iphone.h:203
struct retry_timer timer
Pairing timer.
Definition: iphone.h:190

References DBGC, EPERM, error, ipair_rx_pair(), ipair_tx_pair(), ipair::rx, start_timer_nodelay(), strcmp(), ipair::timer, and ipair::tx.

Referenced by ipair_rx_session().

◆ ipair_window_changed()

static void ipair_window_changed ( struct ipair ipair)
static

Handle window change notification.

Parameters
ipairPairing client

Definition at line 1736 of file iphone.c.

1736  {
1737 
1738  /* Report pairing as complete once TLS session has been established */
1739  if ( ( ipair->flags & IPAIR_TLS ) && xfer_window ( &ipair->xfer ) ) {
1740 
1741  /* Sanity checks */
1744  assert ( ! x509_is_valid ( ipair->icert.root, NULL ) );
1745  assert ( ! x509_is_valid ( ipair->icert.host, NULL ) );
1746  assert ( ! x509_is_valid ( ipair->icert.device, NULL ) );
1747 
1748  /* Report pairing as complete */
1749  DBGC ( ipair, "IPAIR %p established TLS session\n", ipair );
1750  ipair_close ( ipair, 0 );
1751  return;
1752  }
1753 }
static void ipair_close(struct ipair *ipair, int rc)
Shut down pairing client.
Definition: iphone.c:1246
static struct x509_root icert_root
Root of trust for iPhone certificates.
Definition: iphone.c:95
#define DBGC(...)
Definition: compiler.h:505
struct interface xfer
Data transfer interface.
Definition: iphone.h:187
int x509_is_valid(struct x509_certificate *cert, struct x509_root *root)
Check if X.509 certificate is valid.
Definition: x509.c:1313
struct x509_certificate * device
Device certificate.
Definition: iphone.h:39
size_t xfer_window(struct interface *intf)
Check flow control window.
Definition: xfer.c:117
An iPhone pairing client.
Definition: iphone.h:183
struct x509_certificate * host
Host certificate.
Definition: iphone.h:37
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct x509_certificate * root
Root certificate.
Definition: iphone.h:35
struct icert icert
Pairing certificates.
Definition: iphone.h:208
TLS session has been started.
Definition: iphone.h:218
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
unsigned int flags
State flags.
Definition: iphone.h:205

References assert(), DBGC, icert::device, ipair::flags, icert::host, ipair::icert, icert_root, ipair_close(), IPAIR_TLS, NULL, icert::root, x509_is_valid(), ipair::xfer, and xfer_window().

◆ ipair_deliver()

static int ipair_deliver ( struct ipair ipair,
struct io_buffer iobuf,
struct xfer_metadata *meta  __unused 
)
static

Handle received data.

Parameters
ipairPairing client
iobufI/O buffer
metaData transfer metadata
Return values
rcReturn status code

Definition at line 1763 of file iphone.c.

1764  {
1765  struct ipair_header *hdr;
1766  int rc;
1767 
1768  /* Strip header (which may appear in a separate packet) */
1769  if ( ( ! ( ipair->flags & IPAIR_RX_LEN ) ) &&
1770  ( iob_len ( iobuf ) >= sizeof ( *hdr ) ) ) {
1771  iob_pull ( iobuf, sizeof ( *hdr ) );
1772  ipair->flags |= IPAIR_RX_LEN;
1773  }
1774 
1775  /* Clear received header flag if we have a message */
1776  if ( iob_len ( iobuf ) )
1777  ipair->flags &= ~IPAIR_RX_LEN;
1778 
1779  /* Receive message */
1780  if ( ( rc = ipair_rx ( ipair, iobuf->data, iob_len ( iobuf ) ) ) != 0 )
1781  goto error;
1782 
1783  /* Free I/O buffer */
1784  free_iob ( iobuf );
1785 
1786  return 0;
1787 
1788  error:
1789  ipair_close ( ipair, rc );
1790  free_iob ( iobuf );
1791  return rc;
1792 }
static void ipair_close(struct ipair *ipair, int rc)
Shut down pairing client.
Definition: iphone.c:1246
#define iob_pull(iobuf, len)
Definition: iobuf.h:107
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct golan_inbox_hdr hdr
Message header.
Definition: CIB_PRM.h:28
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
struct arbelprm_completion_with_error error
Definition: arbel.h:12
static int ipair_rx(struct ipair *ipair, char *msg, size_t len)
Receive XML message payload.
Definition: iphone.c:1308
An iPhone pairing client.
Definition: iphone.h:183
Standalone length has been received.
Definition: iphone.h:216
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
void * data
Start of data.
Definition: iobuf.h:53
An iPhone USB multiplexed pseudo-TCP XML message header.
Definition: iphone.h:175
unsigned int flags
State flags.
Definition: iphone.h:205

References io_buffer::data, error, ipair::flags, free_iob(), hdr, iob_len(), iob_pull, ipair_close(), ipair_rx(), IPAIR_RX_LEN, and rc.

◆ ipair_expired()

static void ipair_expired ( struct retry_timer timer,
int over  __unused 
)
static

Pairing transmission timer.

Parameters
timerRetransmission timer
overFailure indicator

Definition at line 1800 of file iphone.c.

1800  {
1801  struct ipair *ipair = container_of ( timer, struct ipair, timer );
1802  int ( * tx ) ( struct ipair *ipair );
1803  int rc;
1804 
1805  /* Sanity check */
1806  tx = ipair->tx;
1807  assert ( tx != NULL );
1808 
1809  /* Clear pending transmission */
1810  ipair->tx = NULL;
1811 
1812  /* Transmit data, if applicable */
1813  if ( ( rc = tx ( ipair ) ) != 0 )
1814  ipair_close ( ipair, rc );
1815 }
static void ipair_close(struct ipair *ipair, int rc)
Shut down pairing client.
Definition: iphone.c:1246
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int(* tx)(struct ipair *ipair)
Transmit message.
Definition: iphone.h:196
An iPhone pairing client.
Definition: iphone.h:183
A timer.
Definition: timer.h:29
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
u8 tx[WPA_TKIP_MIC_KEY_LEN]
MIC key for packets to the AP.
Definition: wpa.h:237

References assert(), container_of, ipair_close(), NULL, rc, ipair::tx, and tx.

Referenced by ipair_create().

◆ iphone_in_complete()

static void iphone_in_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete bulk IN transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 1879 of file iphone.c.

1880  {
1881  struct iphone *iphone = container_of ( ep, struct iphone, usbnet.in );
1882  struct net_device *netdev = iphone->netdev;
1883 
1884  /* Profile receive completions */
1885  profile_start ( &iphone_in_profiler );
1886 
1887  /* Ignore packets cancelled when the endpoint closes */
1888  if ( ! ep->open )
1889  goto ignore;
1890 
1891  /* Record USB errors against the network device */
1892  if ( rc != 0 ) {
1893  DBGC ( iphone, "IPHONE %p bulk IN failed: %s\n",
1894  iphone, strerror ( rc ) );
1895  goto error;
1896  }
1897 
1898  /* Strip padding */
1899  if ( iob_len ( iobuf ) < IPHONE_IN_PAD ) {
1900  DBGC ( iphone, "IPHONE %p malformed bulk IN:\n", iphone );
1901  DBGC_HDA ( iphone, 0, iobuf->data, iob_len ( iobuf ) );
1902  rc = -EINVAL;
1903  goto error;
1904  }
1905  iob_pull ( iobuf, IPHONE_IN_PAD );
1906 
1907  /* Hand off to network stack */
1908  netdev_rx ( netdev, iob_disown ( iobuf ) );
1909 
1910  profile_stop ( &iphone_in_profiler );
1911  return;
1912 
1913  error:
1914  netdev_rx_err ( netdev, iob_disown ( iobuf ), rc );
1915  ignore:
1916  free_iob ( iobuf );
1917 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:107
#define EINVAL
Invalid argument.
Definition: errno.h:429
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:587
#define IPHONE_IN_PAD
Bulk IN padding.
Definition: iphone.h:272
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
struct arbelprm_completion_with_error error
Definition: arbel.h:12
#define DBGC(...)
Definition: compiler.h:505
int open
Endpoint is open.
Definition: usb.h:419
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:217
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
#define DBGC_HDA(...)
Definition: compiler.h:506
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:161
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
A network device.
Definition: netdevice.h:353
struct usb_endpoint in
Bulk IN endpoint.
Definition: usbnet.h:30
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:549
An iPhone network device.
Definition: iphone.h:255
void * data
Start of data.
Definition: iobuf.h:53
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263
struct net_device * netdev
Network device.
Definition: iphone.h:261

References container_of, io_buffer::data, DBGC, DBGC_HDA, EINVAL, error, free_iob(), usbnet_device::in, iob_disown, iob_len(), iob_pull, IPHONE_IN_PAD, netdev, iphone::netdev, netdev_rx(), netdev_rx_err(), usb_endpoint::open, profile_start(), profile_stop(), rc, strerror(), and iphone::usbnet.

◆ iphone_out_transmit()

static int iphone_out_transmit ( struct iphone iphone,
struct io_buffer iobuf 
)
static

Transmit packet.

Parameters
iphoneiPhone device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 1931 of file iphone.c.

1932  {
1933  int rc;
1934 
1935  /* Profile transmissions */
1936  profile_start ( &iphone_out_profiler );
1937 
1938  /* Enqueue I/O buffer */
1939  if ( ( rc = usb_stream ( &iphone->usbnet.out, iobuf, 1 ) ) != 0 )
1940  return rc;
1941 
1942  profile_stop ( &iphone_out_profiler );
1943  return 0;
1944 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
int usb_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
Enqueue USB stream transfer.
Definition: usb.c:546
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:174
struct usb_endpoint out
Bulk OUT endpoint.
Definition: usbnet.h:32
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:161
An iPhone network device.
Definition: iphone.h:255
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263

References usbnet_device::out, profile_start(), profile_stop(), rc, usb_stream(), and iphone::usbnet.

Referenced by iphone_transmit().

◆ iphone_out_complete()

static void iphone_out_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete bulk OUT transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 1953 of file iphone.c.

1954  {
1955  struct iphone *iphone = container_of ( ep, struct iphone, usbnet.out );
1956  struct net_device *netdev = iphone->netdev;
1957 
1958  /* Report TX completion */
1959  netdev_tx_complete_err ( netdev, iobuf, rc );
1960 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct usb_endpoint out
Bulk OUT endpoint.
Definition: usbnet.h:32
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:353
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:471
An iPhone network device.
Definition: iphone.h:255
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263
struct net_device * netdev
Network device.
Definition: iphone.h:261

References container_of, netdev, iphone::netdev, netdev_tx_complete_err(), usbnet_device::out, rc, and iphone::usbnet.

◆ iphone_check_pair()

static int iphone_check_pair ( struct iphone iphone)
static

Check pairing status.

Parameters
iphoneiPhone device
Return values
rcReturn status code

Definition at line 1973 of file iphone.c.

1973  {
1974  struct imux *imux;
1975 
1976  /* Find corresponding USB multiplexer */
1977  list_for_each_entry ( imux, &imuxes, list ) {
1978  if ( imux->usb == iphone->usb )
1979  return imux->rc;
1980  }
1981 
1982  return -EPIPE_NO_MUX;
1983 }
#define EPIPE_NO_MUX
Definition: iphone.c:52
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:432
struct usb_device * usb
USB device.
Definition: iphone.h:257
An iPhone USB multiplexer.
Definition: iphone.h:115
struct usb_device * usb
USB device.
Definition: iphone.h:119
An iPhone network device.
Definition: iphone.h:255
int rc
Pairing status.
Definition: iphone.h:152
struct list_head list
List of USB multiplexers.
Definition: iphone.h:125

References EPIPE_NO_MUX, imux::list, list_for_each_entry, imux::rc, imux::usb, and iphone::usb.

Referenced by iphone_check_link().

◆ iphone_check_link()

static void iphone_check_link ( struct net_device netdev)
static

Check link status.

Parameters
netdevNetwork device

Definition at line 1990 of file iphone.c.

1990  {
1991  struct iphone *iphone = netdev->priv;
1992  struct usb_device *usb = iphone->usb;
1993  uint8_t status;
1994  int rc;
1995 
1996  /* Check pairing status */
1997  if ( ( rc = iphone_check_pair ( iphone ) ) != 0 )
1998  goto err_pair;
1999 
2000  /* Get link status */
2001  if ( ( rc = usb_control ( usb, IPHONE_GET_LINK, 0, 0, &status,
2002  sizeof ( status ) ) ) != 0 ) {
2003  DBGC ( iphone, "IPHONE %p could not get link status: %s\n",
2004  iphone, strerror ( rc ) );
2005  goto err_control;
2006  }
2007 
2008  /* Check link status */
2009  if ( status != IPHONE_LINK_UP ) {
2010  rc = -ENOTCONN_STATUS ( status );
2011  goto err_status;
2012  }
2013 
2014  /* Success */
2015  rc = 0;
2016 
2017  err_status:
2018  err_control:
2019  err_pair:
2020  /* Report link status. Since we have to check the link
2021  * periodically (due to an absence of an interrupt endpoint),
2022  * do this only if the link status has actually changed.
2023  */
2024  if ( rc != netdev->link_rc ) {
2025  if ( rc == 0 ) {
2026  DBGC ( iphone, "IPHONE %p link up\n", iphone );
2027  } else {
2028  DBGC ( iphone, "IPHONE %p link down: %s\n",
2029  iphone, strerror ( rc ) );
2030  }
2031  netdev_link_err ( netdev, rc );
2032  }
2033 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int iphone_check_pair(struct iphone *iphone)
Check pairing status.
Definition: iphone.c:1973
#define DBGC(...)
Definition: compiler.h:505
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:784
int link_rc
Link status code.
Definition: netdevice.h:402
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
#define ENOTCONN_STATUS(status)
Definition: iphone.c:64
A USB device.
Definition: usb.h:723
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
void netdev_link_err(struct net_device *netdev, int rc)
Mark network device as having a specific link state.
Definition: netdevice.c:208
struct usb_device * usb
USB device.
Definition: iphone.h:257
unsigned char uint8_t
Definition: stdint.h:10
uint8_t status
Status.
Definition: ena.h:16
An iPhone network device.
Definition: iphone.h:255
#define IPHONE_GET_LINK
Get link status.
Definition: iphone.h:240
Link up.
Definition: iphone.h:249

References DBGC, ENOTCONN_STATUS, iphone_check_pair(), IPHONE_GET_LINK, IPHONE_LINK_UP, net_device::link_rc, netdev, netdev_link_err(), net_device::priv, rc, status, strerror(), iphone::usb, and usb_control().

Referenced by iphone_expired(), and iphone_probe().

◆ iphone_expired()

static void iphone_expired ( struct retry_timer timer,
int over  __unused 
)
static

Periodically update link status.

Parameters
timerLink status timer
overFailure indicator

Definition at line 2041 of file iphone.c.

2041  {
2042  struct iphone *iphone = container_of ( timer, struct iphone, timer );
2043  struct net_device *netdev = iphone->netdev;
2044 
2045  /* Check link status */
2047 
2048  /* Restart timer, if device is open */
2049  if ( netdev_is_open ( netdev ) )
2051 }
static void iphone_check_link(struct net_device *netdev)
Check link status.
Definition: iphone.c:1990
A timer.
Definition: timer.h:29
static int netdev_is_open(struct net_device *netdev)
Check whether or not network device is open.
Definition: netdevice.h:662
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:353
void start_timer_fixed(struct retry_timer *timer, unsigned long timeout)
Start timer with a specified timeout.
Definition: retry.c:65
An iPhone network device.
Definition: iphone.h:255
#define IPHONE_LINK_CHECK_INTERVAL
Link check interval.
Definition: iphone.h:290
struct net_device * netdev
Network device.
Definition: iphone.h:261

References container_of, iphone_check_link(), IPHONE_LINK_CHECK_INTERVAL, netdev, iphone::netdev, netdev_is_open(), and start_timer_fixed().

Referenced by iphone_probe().

◆ iphone_open()

static int iphone_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 2059 of file iphone.c.

2059  {
2060  struct iphone *iphone = netdev->priv;
2061  int rc;
2062 
2063  /* Open USB network device */
2064  if ( ( rc = usbnet_open ( &iphone->usbnet ) ) != 0 ) {
2065  DBGC ( iphone, "IPHONE %p could not open: %s\n",
2066  iphone, strerror ( rc ) );
2067  goto err_open;
2068  }
2069 
2070  /* Start the link status check timer */
2072 
2073  return 0;
2074 
2075  usbnet_close ( &iphone->usbnet );
2076  err_open:
2077  return rc;
2078 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void start_timer_nodelay(struct retry_timer *timer)
Start timer with no delay.
Definition: retry.h:100
#define DBGC(...)
Definition: compiler.h:505
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
An iPhone network device.
Definition: iphone.h:255
struct retry_timer timer
Link status check timer.
Definition: iphone.h:268
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263
void usbnet_close(struct usbnet_device *usbnet)
Close USB network device.
Definition: usbnet.c:128
int usbnet_open(struct usbnet_device *usbnet)
Open USB network device.
Definition: usbnet.c:55

References DBGC, netdev, net_device::priv, rc, start_timer_nodelay(), strerror(), iphone::timer, iphone::usbnet, usbnet_close(), and usbnet_open().

◆ iphone_close()

static void iphone_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 2085 of file iphone.c.

2085  {
2086  struct iphone *iphone = netdev->priv;
2087 
2088  /* Stop the link status check timer */
2089  stop_timer ( &iphone->timer );
2090 
2091  /* Close USB network device */
2092  usbnet_close ( &iphone->usbnet );
2093 }
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
void stop_timer(struct retry_timer *timer)
Stop timer.
Definition: retry.c:118
An iPhone network device.
Definition: iphone.h:255
struct retry_timer timer
Link status check timer.
Definition: iphone.h:268
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263
void usbnet_close(struct usbnet_device *usbnet)
Close USB network device.
Definition: usbnet.c:128

References netdev, net_device::priv, stop_timer(), iphone::timer, iphone::usbnet, and usbnet_close().

◆ iphone_transmit()

static int iphone_transmit ( struct net_device netdev,
struct io_buffer iobuf 
)
static

Transmit packet.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 2102 of file iphone.c.

2103  {
2104  struct iphone *iphone = netdev->priv;
2105  int rc;
2106 
2107  /* Transmit packet */
2108  if ( ( rc = iphone_out_transmit ( iphone, iobuf ) ) != 0 )
2109  return rc;
2110 
2111  return 0;
2112 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
static int iphone_out_transmit(struct iphone *iphone, struct io_buffer *iobuf)
Transmit packet.
Definition: iphone.c:1931
An iPhone network device.
Definition: iphone.h:255

References iphone_out_transmit(), netdev, net_device::priv, and rc.

◆ iphone_poll()

static void iphone_poll ( struct net_device netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 2119 of file iphone.c.

2119  {
2120  struct iphone *iphone = netdev->priv;
2121  int rc;
2122 
2123  /* Poll USB bus */
2124  usb_poll ( iphone->bus );
2125 
2126  /* Refill endpoints */
2127  if ( ( rc = usbnet_refill ( &iphone->usbnet ) ) != 0 )
2128  netdev_rx_err ( netdev, NULL, rc );
2129 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:587
void * priv
Driver private data.
Definition: netdevice.h:432
static struct net_device * netdev
Definition: gdbudp.c:52
int usbnet_refill(struct usbnet_device *usbnet)
Refill USB network device bulk IN and interrupt endpoints.
Definition: usbnet.c:152
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition: usb.h:1072
An iPhone network device.
Definition: iphone.h:255
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
struct usb_bus * bus
USB bus.
Definition: iphone.h:259

References iphone::bus, netdev, netdev_rx_err(), NULL, net_device::priv, rc, usb_poll(), iphone::usbnet, and usbnet_refill().

◆ iphone_probe()

static int iphone_probe ( struct usb_function func,
struct usb_configuration_descriptor config 
)
static

Probe device.

Parameters
funcUSB function
configConfiguration descriptor
Return values
rcReturn status code

Definition at line 2146 of file iphone.c.

2147  {
2148  struct usb_device *usb = func->usb;
2149  struct net_device *netdev;
2150  struct iphone *iphone;
2151  int rc;
2152 
2153  /* Allocate and initialise structure */
2154  netdev = alloc_etherdev ( sizeof ( *iphone ) );
2155  if ( ! netdev ) {
2156  rc = -ENOMEM;
2157  goto err_alloc;
2158  }
2160  netdev->dev = &func->dev;
2161  iphone = netdev->priv;
2162  memset ( iphone, 0, sizeof ( *iphone ) );
2163  iphone->usb = usb;
2164  iphone->bus = usb->port->hub->bus;
2165  iphone->netdev = netdev;
2170  timer_init ( &iphone->timer, iphone_expired, &netdev->refcnt );
2171  DBGC ( iphone, "IPHONE %p on %s\n", iphone, func->name );
2172 
2173  /* Describe USB network device */
2174  if ( ( rc = usbnet_describe ( &iphone->usbnet, config ) ) != 0 ) {
2175  DBGC ( iphone, "IPHONE %p could not describe: %s\n",
2176  iphone, strerror ( rc ) );
2177  goto err_describe;
2178  }
2179 
2180  /* Fetch MAC address */
2181  if ( ( rc = usb_control ( usb, IPHONE_GET_MAC, 0, 0, netdev->hw_addr,
2182  ETH_ALEN ) ) != 0 ) {
2183  DBGC ( iphone, "IPHONE %p could not fetch MAC address: %s\n",
2184  iphone, strerror ( rc ) );
2185  goto err_fetch_mac;
2186  }
2187 
2188  /* Register network device */
2189  if ( ( rc = register_netdev ( netdev ) ) != 0 )
2190  goto err_register;
2191 
2192  /* Set initial link status */
2194 
2195  /* Add to list of iPhone network devices */
2196  list_add ( &iphone->list, &iphones );
2197 
2198  usb_func_set_drvdata ( func, iphone );
2199  return 0;
2200 
2201  list_del ( &iphone->list );
2203  err_register:
2204  err_fetch_mac:
2205  err_describe:
2206  netdev_nullify ( netdev );
2207  netdev_put ( netdev );
2208  err_alloc:
2209  return rc;
2210 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Name.
Definition: usb.h:676
static void iphone_check_link(struct net_device *netdev)
Check link status.
Definition: iphone.c:1990
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:70
#define DBGC(...)
Definition: compiler.h:505
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition: usb.c:784
#define IPHONE_IN_MTU
Bulk IN buffer size.
Definition: iphone.h:278
static struct net_device_operations iphone_operations
iPhone network device operations
Definition: iphone.c:2132
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:519
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
#define ENOMEM
Not enough space.
Definition: errno.h:535
struct usb_port * port
USB port.
Definition: usb.h:727
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:576
void * priv
Driver private data.
Definition: netdevice.h:432
static void usb_refill_init(struct usb_endpoint *ep, size_t reserve, size_t len, unsigned int max)
Initialise USB endpoint refill.
Definition: usb.h:617
static struct net_device * netdev
Definition: gdbudp.c:52
static void usb_func_set_drvdata(struct usb_function *func, void *priv)
Set USB function driver private data.
Definition: usb.h:707
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
A USB device.
Definition: usb.h:723
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
struct refcnt refcnt
Reference counter.
Definition: netdevice.h:355
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:760
A network device.
Definition: netdevice.h:353
struct usb_endpoint in
Bulk IN endpoint.
Definition: usbnet.h:30
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
struct usb_device * usb
USB device.
Definition: iphone.h:257
static struct usb_endpoint_driver_operations iphone_out_operations
Bulk OUT endpoint operations.
Definition: iphone.c:1963
#define ETH_ALEN
Definition: if_ether.h:9
struct usb_device * usb
USB device.
Definition: usb.h:678
static struct usb_endpoint_driver_operations iphone_in_operations
Bulk IN endpoint operations.
Definition: iphone.c:1920
struct device * dev
Underlying hardware device.
Definition: netdevice.h:365
static void iphone_expired(struct retry_timer *timer, int over __unused)
Periodically update link status.
Definition: iphone.c:2041
An iPhone network device.
Definition: iphone.h:255
static void usbnet_init(struct usbnet_device *usbnet, struct usb_function *func, struct usb_endpoint_driver_operations *intr, struct usb_endpoint_driver_operations *in, struct usb_endpoint_driver_operations *out)
Initialise USB network device.
Definition: usbnet.h:45
struct usb_hub * hub
USB hub.
Definition: usb.h:815
#define IPHONE_IN_MAX_FILL
Bulk IN maximum fill level.
Definition: iphone.h:284
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:265
struct retry_timer timer
Link status check timer.
Definition: iphone.h:268
int usbnet_describe(struct usbnet_device *usbnet, struct usb_configuration_descriptor *config)
Describe USB network device interfaces.
Definition: usbnet.c:278
#define IPHONE_GET_MAC
Get MAC address.
Definition: iphone.h:235
struct usbnet_device usbnet
USB network device.
Definition: iphone.h:263
struct device dev
Generic device.
Definition: usb.h:682
struct usb_bus * bus
USB bus.
Definition: usb.h:845
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:382
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
struct usb_bus * bus
USB bus.
Definition: iphone.h:259
struct net_device * netdev
Network device.
Definition: iphone.h:261
struct list_head list
List of iPhone network devices.
Definition: iphone.h:266
void * memset(void *dest, int character, size_t len) __nonnull

References alloc_etherdev(), iphone::bus, usb_hub::bus, DBGC, net_device::dev, usb_function::dev, ENOMEM, ETH_ALEN, usb_port::hub, net_device::hw_addr, usbnet_device::in, iphone_check_link(), iphone_expired(), IPHONE_GET_MAC, IPHONE_IN_MAX_FILL, IPHONE_IN_MTU, iphone_in_operations, iphone_operations, iphone_out_operations, iphone::list, list_add, list_del, memset(), usb_function::name, netdev, iphone::netdev, netdev_init(), netdev_nullify(), netdev_put(), NULL, usb_device::port, net_device::priv, rc, net_device::refcnt, register_netdev(), strerror(), iphone::timer, unregister_netdev(), iphone::usb, usb_function::usb, usb_control(), usb_func_set_drvdata(), usb_refill_init(), iphone::usbnet, usbnet_describe(), and usbnet_init().

◆ iphone_remove()

static void iphone_remove ( struct usb_function func)
static

Remove device.

Parameters
funcUSB function

Definition at line 2217 of file iphone.c.

2217  {
2218  struct iphone *iphone = usb_func_get_drvdata ( func );
2219  struct net_device *netdev = iphone->netdev;
2220 
2221  list_del ( &iphone->list );
2223  netdev_nullify ( netdev );
2224  netdev_put ( netdev );
2225 }
static void * usb_func_get_drvdata(struct usb_function *func)
Get USB function driver private data.
Definition: usb.h:718
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:576
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
A network device.
Definition: netdevice.h:353
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
An iPhone network device.
Definition: iphone.h:255
struct net_device * netdev
Network device.
Definition: iphone.h:261
struct list_head list
List of iPhone network devices.
Definition: iphone.h:266

References iphone::list, list_del, netdev, iphone::netdev, netdev_nullify(), netdev_put(), unregister_netdev(), and usb_func_get_drvdata().

◆ REQUIRING_SYMBOL()

REQUIRING_SYMBOL ( iphone_driver  )

◆ REQUIRE_OBJECT()

REQUIRE_OBJECT ( rsa_sha256  )

Variable Documentation

◆ __profiler

struct profiler iphone_out_profiler __profiler
static
Initial value:
=
{ .name = "iphone.in" }

Bulk IN completion profiler.

Bulk OUT profiler.

Definition at line 71 of file iphone.c.

◆ icert_root_fingerprint

uint8_t icert_root_fingerprint[SHA256_DIGEST_SIZE]
static

iPhone root certificate fingerprint

Definition at line 92 of file iphone.c.

Referenced by icert_certs().

◆ icert_root

struct x509_root icert_root
static
Initial value:
= {
.refcnt = REF_INIT ( ref_no_free ),
.digest = &sha256_algorithm,
.count = 1,
.fingerprints = icert_root_fingerprint,
}
static uint8_t icert_root_fingerprint[SHA256_DIGEST_SIZE]
iPhone root certificate fingerprint
Definition: iphone.c:92
struct digest_algorithm sha256_algorithm
SHA-256 algorithm.
Definition: sha256.c:265
#define REF_INIT(free_fn)
Initialise a static reference counter.
Definition: refcnt.h:78
void ref_no_free(struct refcnt *refcnt __unused)
Do not free reference-counted object.
Definition: refcnt.c:102

Root of trust for iPhone certificates.

Definition at line 95 of file iphone.c.

Referenced by icert_certs(), ipair_rx_session(), and ipair_window_changed().

◆ icert_nul

const uint8_t icert_nul[] = { 0x00 }
static

Single zero byte used in constructed certificates.

Definition at line 103 of file iphone.c.

Referenced by icert_cert(), and icert_certs().

◆ icert_rsa

const uint8_t icert_rsa[]
static
Initial value:
= {
ASN1_NULL, 0x00 )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_NULL
ASN.1 null.
Definition: asn1.h:72
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75
#define ASN1_OID_RSAENCRYPTION
ASN.1 OID for rsaEncryption (1.2.840.113549.1.1.1)
Definition: asn1.h:168

"RSA algorithm" identifier used in constructed certificates

Definition at line 106 of file iphone.c.

Referenced by icert_cert().

◆ icert_sha256_rsa

const uint8_t icert_sha256_rsa[]
static
Initial value:
= {
ASN1_NULL, 0x00 ),
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_NULL
ASN.1 null.
Definition: asn1.h:72
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75
#define ASN1_OID_SHA256WITHRSAENCRYPTION
ASN.1 OID for sha256WithRSAEncryption (1.2.840.113549.1.1.11)
Definition: asn1.h:186

"SHA-256 with RSA algorithm" identifier used in constructed certificates

Definition at line 114 of file iphone.c.

Referenced by icert_cert().

◆ icert_root_exts_data

const uint8_t icert_root_exts_data[]
static
Initial value:
= {
0xff ) ) ) ) ) )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_BOOLEAN
ASN.1 boolean.
Definition: asn1.h:60
#define ASN1_OID_BASICCONSTRAINTS
ASN.1 OID for id-ce-basicConstraints (2.5.29.19)
Definition: asn1.h:332
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75
#define ASN1_EXPLICIT_TAG(number)
ASN.1 explicit tag.
Definition: asn1.h:99
#define ASN1_OCTET_STRING
ASN.1 octet string.
Definition: asn1.h:69

Extensions used in constructed root certificate.

Definition at line 121 of file iphone.c.

◆ icert_root_exts

struct asn1_cursor icert_root_exts
static
Initial value:
=
static const uint8_t icert_root_exts_data[]
Extensions used in constructed root certificate.
Definition: iphone.c:121
#define ASN1_CURSOR(value)
Define an ASN.1 cursor for a static value.
Definition: asn1.h:402

Extensions used in constructed root certificate.

Definition at line 138 of file iphone.c.

Referenced by icert_certs().

◆ icert_leaf_exts_data

const uint8_t icert_leaf_exts_data[]
static
Initial value:
= {
0x00 ) ) ) ),
0x00 ) ) ) ) )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_BOOLEAN
ASN.1 boolean.
Definition: asn1.h:60
#define ASN1_OID_BASICCONSTRAINTS
ASN.1 OID for id-ce-basicConstraints (2.5.29.19)
Definition: asn1.h:332
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75
#define ASN1_EXPLICIT_TAG(number)
ASN.1 explicit tag.
Definition: asn1.h:99
#define ASN1_OCTET_STRING
ASN.1 octet string.
Definition: asn1.h:69
#define ASN1_BIT_STRING
ASN.1 bit string.
Definition: asn1.h:66
#define ASN1_OID_KEYUSAGE
ASN.1 OID for id-ce-keyUsage (2.5.29.15)
Definition: asn1.h:327

Extensions used in constructed leaf certificates.

Definition at line 142 of file iphone.c.

◆ icert_leaf_exts

struct asn1_cursor icert_leaf_exts
static
Initial value:
=
#define ASN1_CURSOR(value)
Define an ASN.1 cursor for a static value.
Definition: asn1.h:402
static const uint8_t icert_leaf_exts_data[]
Extensions used in constructed leaf certificates.
Definition: iphone.c:142

Extensions used in constructed leaf certificates.

Definition at line 171 of file iphone.c.

Referenced by icert_certs().

◆ icert_tbs_prefix

const uint8_t icert_tbs_prefix[]
static
Initial value:
= {
ASN1_NULL, 0x00 )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_NULL
ASN.1 null.
Definition: asn1.h:72
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_INTEGER
ASN.1 integer.
Definition: asn1.h:63
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75
#define ASN1_EXPLICIT_TAG(number)
ASN.1 explicit tag.
Definition: asn1.h:99
#define ASN1_OID_SHA256WITHRSAENCRYPTION
ASN.1 OID for sha256WithRSAEncryption (1.2.840.113549.1.1.11)
Definition: asn1.h:186

"TBSCertificate" prefix in constructed certificates

Definition at line 175 of file iphone.c.

Referenced by icert_cert().

◆ icert_validity

const uint8_t icert_validity[]
static
Initial value:
= {
'1', '9', '7', '8', '1', '2', '1', '0',
'2', '2', '0', '0', '0', '0', 'Z' ),
'2', '9', '9', '9', '0', '1', '0', '1',
'0', '0', '0', '0', '0', '0', 'Z' ) )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_GENERALIZED_TIME
ASN.1 generalized time.
Definition: asn1.h:87
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90

Validity period in constructed certificates.

Definition at line 187 of file iphone.c.

Referenced by icert_cert().

◆ icert_name_root_data

const uint8_t icert_name_root_data[]
static
Initial value:
= {
ASN1_SHORT ( ASN1_UTF8_STRING, 'R', 'o', 'o', 't' ) ) ) )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_SET
ASN.1 set.
Definition: asn1.h:93
#define ASN1_OID_COMMON_NAME
ASN.1 OID for commonName (2.5.4.3)
Definition: asn1.h:322
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_UTF8_STRING
ASN.1 UTF-8 string.
Definition: asn1.h:81
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75

"Root" subject name

Definition at line 201 of file iphone.c.

◆ icert_name_root

struct asn1_cursor icert_name_root
static
Initial value:
=
static const uint8_t icert_name_root_data[]
"Root" subject name
Definition: iphone.c:201
#define ASN1_CURSOR(value)
Define an ASN.1 cursor for a static value.
Definition: asn1.h:402

"Root" subject name

Definition at line 209 of file iphone.c.

Referenced by icert_certs().

◆ icert_name_ipxe_data

const uint8_t icert_name_ipxe_data[]
static
Initial value:
= {
ASN1_SHORT ( ASN1_UTF8_STRING, 'i', 'P', 'X', 'E' ) ) ) )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_SET
ASN.1 set.
Definition: asn1.h:93
#define ASN1_OID_COMMON_NAME
ASN.1 OID for commonName (2.5.4.3)
Definition: asn1.h:322
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_UTF8_STRING
ASN.1 UTF-8 string.
Definition: asn1.h:81
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75

"iPXE" subject name

Definition at line 213 of file iphone.c.

◆ icert_name_ipxe

struct asn1_cursor icert_name_ipxe
static
Initial value:
=
static const uint8_t icert_name_ipxe_data[]
"iPXE" subject name
Definition: iphone.c:213
#define ASN1_CURSOR(value)
Define an ASN.1 cursor for a static value.
Definition: asn1.h:402

"iPXE" subject name

Definition at line 221 of file iphone.c.

Referenced by icert_certs().

◆ icert_name_iphone_data

const uint8_t icert_name_iphone_data[]
static
Initial value:
= {
'i', 'P', 'h', 'o', 'n', 'e' ) ) ) )
}
#define ASN1_SHORT(tag,...)
Construct a short ASN.1 value.
Definition: asn1.h:105
#define ASN1_SET
ASN.1 set.
Definition: asn1.h:93
#define ASN1_OID_COMMON_NAME
ASN.1 OID for commonName (2.5.4.3)
Definition: asn1.h:322
#define ASN1_SEQUENCE
ASN.1 sequence.
Definition: asn1.h:90
#define ASN1_UTF8_STRING
ASN.1 UTF-8 string.
Definition: asn1.h:81
#define ASN1_OID
ASN.1 object identifier.
Definition: asn1.h:75

"iPhone" subject name

Definition at line 225 of file iphone.c.

◆ icert_name_iphone

struct asn1_cursor icert_name_iphone
static
Initial value:
=
#define ASN1_CURSOR(value)
Define an ASN.1 cursor for a static value.
Definition: asn1.h:402
static const uint8_t icert_name_iphone_data[]
"iPhone" subject name
Definition: iphone.c:225

"iPhone" subject name

Definition at line 234 of file iphone.c.

Referenced by icert_certs().

◆ __unused

const uint8_t icert_private_b [] __unused
static
Initial value:
= {
0x02, 0x81, 0x81, 0x00, 0xc9, 0xc0, 0xdd, 0xa6, 0xd5, 0xf9, 0x05, 0x3e,
0x1d, 0xcb, 0x67, 0x08, 0xa8, 0x50, 0x27, 0x63, 0x95, 0x87, 0x42, 0x7e,
0xfb, 0xff, 0x55, 0x55, 0xb8, 0xc0, 0x6f, 0x13, 0xcb, 0xf7, 0xc5, 0x1b,
0xda, 0x44, 0x3c, 0xbc, 0x1a, 0xe1, 0x15, 0x1e, 0xab, 0x56, 0x74, 0x02,
0x8b, 0xb3, 0xcd, 0x42, 0x56, 0xcd, 0x9c, 0xc3, 0x15, 0xe2, 0x33, 0x97,
0x6d, 0x77, 0xdd, 0x20, 0x3a, 0x74, 0xb1, 0x4c, 0xee, 0xeb, 0xe8, 0xaa,
0x20, 0x71, 0x5a, 0xa2, 0x5b, 0xf8, 0x1a, 0xcb, 0xd2, 0x7b, 0x96, 0xb6,
0x42, 0xb4, 0x7c, 0x7a, 0x13, 0xec, 0x55, 0xd3, 0x36, 0x8b, 0xe3, 0x17,
0xc5, 0xc4, 0xcc, 0xe0, 0x27, 0x8c, 0xed, 0xa1, 0x4c, 0x8a, 0x50, 0x4a,
0x1c, 0xc4, 0x58, 0xf6, 0xcd, 0xcc, 0xc3, 0x5f, 0xe6, 0x3c, 0xff, 0x97,
0x51, 0xed, 0xf5, 0xaa, 0x89, 0xcc, 0x3f, 0x63, 0x67, 0x46, 0x9f, 0xbf,
0x02, 0x03, 0x01, 0x00, 0x01
}

Public key(s) used for pairing.

"Private" key(s) used for pairing

Yes, this publicly visible "private" key completely obviates any nominal security provided by the pairing process. Looked at another way, this modifies the iPhone to behave like every other USB tethering device: if the cable is physically connected and tethering is enabled then the device will Just Work.

Unlike Android, the iPhone seems to have no meaningful permissions model: any device that is trusted to use the phone for tethering seems to also be trusted to use the iPhone for any other purpose (e.g. accessing files, reading messages, etc). Apple should probably fix this at some point, e.g. via defining extended key usages in the root and host certificates.

Definition at line 238 of file iphone.c.

◆ icert_begin

const char icert_begin[] = "-----BEGIN CERTIFICATE-----\n"
static

PEM certificate prefix.

Definition at line 321 of file iphone.c.

Referenced by icert_encode().

◆ icert_end

const char icert_end[] = "\n-----END CERTIFICATE-----\n"
static

PEM certificate suffix.

Definition at line 324 of file iphone.c.

Referenced by icert_encode().

◆ imux_in_operations

struct usb_endpoint_driver_operations imux_in_operations
static
Initial value:
= {
.complete = imux_in_complete,
}
static void imux_in_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk IN transfer.
Definition: iphone.c:867

Bulk IN endpoint operations.

Definition at line 919 of file iphone.c.

Referenced by imux_probe().

◆ imux_out_operations

struct usb_endpoint_driver_operations imux_out_operations
static
Initial value:
= {
.complete = imux_out_complete,
}
static void imux_out_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk OUT transfer.
Definition: iphone.c:930

Bulk OUT endpoint operations.

Definition at line 946 of file iphone.c.

Referenced by imux_probe().

◆ imux_tcp_operations

struct interface_operation imux_tcp_operations[]
static
Initial value:
= {
}
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:250
struct io_buffer * xfer_alloc_iob(struct interface *intf, size_t len)
Allocate I/O buffer.
Definition: xfer.c:159
static int imux_deliver(struct imux *imux, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
Transmit packet via pseudo-TCP socket.
Definition: iphone.c:1040
static struct io_buffer * imux_alloc_iob(struct imux *imux __unused, size_t len)
Allocate I/O buffer for pseudo-TCP socket.
Definition: iphone.c:1016
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:33
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:195
An iPhone USB multiplexer.
Definition: iphone.h:115
static void imux_close(struct imux *imux, int rc)
Close USB multiplexer.
Definition: iphone.c:973

Pseudo-TCP socket interface operations.

Definition at line 1054 of file iphone.c.

◆ imux_tcp_desc

struct interface_descriptor imux_tcp_desc
static
Initial value:
=
An iPhone USB multiplexer.
Definition: iphone.h:115
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition: interface.h:81
static struct interface_operation imux_tcp_operations[]
Pseudo-TCP socket interface operations.
Definition: iphone.c:1054

Pseudo-TCP socket interface descriptor.

Definition at line 1061 of file iphone.c.

Referenced by imux_probe().

◆ imux_process_desc

struct process_descriptor imux_process_desc
static
Initial value:
=
A process.
Definition: process.h:18
An iPhone USB multiplexer.
Definition: iphone.h:115
#define PROC_DESC(object_type, process, _step)
Define a process descriptor.
Definition: process.h:83
static void imux_step(struct imux *imux)
Multiplexer process.
Definition: iphone.c:1069

Multiplexer process descriptor.

Definition at line 1094 of file iphone.c.

Referenced by imux_probe().

◆ imux_ids

struct usb_device_id imux_ids[]
static
Initial value:
= {
{
.name = "imux",
.vendor = 0x05ac,
.product = USB_ANY_ID,
},
}
#define USB_ANY_ID
Match-anything ID.
Definition: usb.h:1373

USB multiplexer device IDs.

Definition at line 1174 of file iphone.c.

◆ __usb_driver

struct usb_driver iphone_driver __usb_driver
Initial value:
= {
.ids = imux_ids,
.id_count = ( sizeof ( imux_ids ) / sizeof ( imux_ids[0] ) ),
.class = USB_CLASS_ID ( 0xff, 0xfe, 0x02 ),
.score = USB_SCORE_NORMAL,
.probe = imux_probe,
.remove = imux_remove,
}
static int imux_probe(struct usb_function *func, struct usb_configuration_descriptor *config)
Probe device.
Definition: iphone.c:1104
#define USB_CLASS_ID(base, subclass, protocol)
Construct USB class ID.
Definition: usb.h:1389
Normal driver.
Definition: usb.h:1453
static void imux_remove(struct usb_function *func)
Remove device.
Definition: iphone.c:1165
static struct usb_device_id imux_ids[]
USB multiplexer device IDs.
Definition: iphone.c:1174

USB multiplexer driver.

iPhone driver

Definition at line 1183 of file iphone.c.

◆ ipair_prefix

const char ipair_prefix[]
static
Initial value:
=
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" "
"\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
"<plist version=\"1.0\">\n"
"<dict>\n"
"<key>Label</key>\n"
"<string>iPXE</string>\n"
"<key>Request</key>\n"

Common prefix for all pairing messages.

Definition at line 1200 of file iphone.c.

Referenced by ipair_tx_pair(), ipair_tx_pubkey(), and ipair_tx_session().

◆ ipair_suffix

const char ipair_suffix[]
static
Initial value:
=
"</dict>\n"
"</plist>\n"

Common suffix for all pairing messages.

Definition at line 1211 of file iphone.c.

Referenced by ipair_tx_pair(), ipair_tx_pubkey(), and ipair_tx_session().

◆ ipair_system_buid

const char ipair_system_buid[] = "E4DB92D2-248A-469A-AC34-92045D07E695"
static

Arbitrary system BUID used for pairing.

Definition at line 1216 of file iphone.c.

Referenced by ipair_tx_pair(), and ipair_tx_session().

◆ ipair_host_id

const char ipair_host_id[] = "93CEBC27-8457-4804-9108-F42549DF6143"
static

Arbitrary host ID used for pairing.

Definition at line 1219 of file iphone.c.

Referenced by ipair_tx_pair(), and ipair_tx_session().

◆ ipair_xfer_operations

struct interface_operation ipair_xfer_operations[]
static
Initial value:
= {
}
static void ipair_close(struct ipair *ipair, int rc)
Shut down pairing client.
Definition: iphone.c:1246
void xfer_window_changed(struct interface *intf)
Report change of flow control window.
Definition: xfer.c:147
void intf_close(struct interface *intf, int rc)
Close an object interface.
Definition: interface.c:250
An iPhone pairing client.
Definition: iphone.h:183
static int ipair_deliver(struct ipair *ipair, struct io_buffer *iobuf, struct xfer_metadata *meta __unused)
Handle received data.
Definition: iphone.c:1763
#define INTF_OP(op_type, object_type, op_func)
Define an object interface operation.
Definition: interface.h:33
int xfer_deliver(struct interface *intf, struct io_buffer *iobuf, struct xfer_metadata *meta)
Deliver datagram.
Definition: xfer.c:195
static void ipair_window_changed(struct ipair *ipair)
Handle window change notification.
Definition: iphone.c:1736

Pairing client interface operations.

Definition at line 1818 of file iphone.c.

◆ ipair_xfer_desc

struct interface_descriptor ipair_xfer_desc
static
Initial value:
=
static struct interface_operation ipair_xfer_operations[]
Pairing client interface operations.
Definition: iphone.c:1818
An iPhone pairing client.
Definition: iphone.h:183
#define INTF_DESC(object_type, intf, operations)
Define an object interface descriptor.
Definition: interface.h:81

Pairing client interface descriptor.

Definition at line 1825 of file iphone.c.

Referenced by ipair_create().

◆ iphone_in_operations

struct usb_endpoint_driver_operations iphone_in_operations
static
Initial value:
= {
.complete = iphone_in_complete,
}
static void iphone_in_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk IN transfer.
Definition: iphone.c:1879

Bulk IN endpoint operations.

Definition at line 1920 of file iphone.c.

Referenced by iphone_probe().

◆ iphone_out_operations

struct usb_endpoint_driver_operations iphone_out_operations
static
Initial value:
= {
.complete = iphone_out_complete,
}
static void iphone_out_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk OUT transfer.
Definition: iphone.c:1953

Bulk OUT endpoint operations.

Definition at line 1963 of file iphone.c.

Referenced by iphone_probe().

◆ iphone_operations

struct net_device_operations iphone_operations
static
Initial value:
= {
.open = iphone_open,
.close = iphone_close,
.transmit = iphone_transmit,
.poll = iphone_poll,
}
static void iphone_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: iphone.c:2119
static int iphone_open(struct net_device *netdev)
Open network device.
Definition: iphone.c:2059
static int iphone_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: iphone.c:2102
static void iphone_close(struct net_device *netdev)
Close network device.
Definition: iphone.c:2085

iPhone network device operations

Definition at line 2132 of file iphone.c.

Referenced by iphone_probe().

◆ iphone_ids

struct usb_device_id iphone_ids[]
static
Initial value:
= {
{
.name = "iphone",
.vendor = 0x05ac,
.product = USB_ANY_ID,
},
}
#define USB_ANY_ID
Match-anything ID.
Definition: usb.h:1373

iPhone device IDs

Definition at line 2228 of file iphone.c.