iPXE
efi_path.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2020 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  */
19 
20 FILE_LICENCE ( GPL2_OR_LATER );
21 FILE_SECBOOT ( PERMITTED );
22 
23 #include <stdlib.h>
24 #include <stdarg.h>
25 #include <string.h>
26 #include <errno.h>
27 #include <byteswap.h>
28 #include <ipxe/netdevice.h>
29 #include <ipxe/vlan.h>
30 #include <ipxe/uuid.h>
31 #include <ipxe/tcpip.h>
32 #include <ipxe/uri.h>
33 #include <ipxe/iscsi.h>
34 #include <ipxe/aoe.h>
35 #include <ipxe/fcp.h>
36 #include <ipxe/ib_srp.h>
37 #include <ipxe/usb.h>
38 #include <ipxe/settings.h>
39 #include <ipxe/dhcp.h>
40 #include <ipxe/efi/efi.h>
41 #include <ipxe/efi/efi_driver.h>
42 #include <ipxe/efi/efi_strings.h>
43 #include <ipxe/efi/efi_path.h>
44 
45 /** @file
46  *
47  * EFI device paths
48  *
49  */
50 
51 /** Dummy parent device path
52  *
53  * This is used as the parent device path when we need to construct a
54  * path for a device that has no EFI parent device.
55  */
56 static struct {
60 } __attribute__ (( packed )) efi_dummy_parent_path = {
61  .bbs = {
62  .Header = {
63  .Type = BBS_DEVICE_PATH,
64  .SubType = BBS_BBS_DP,
65  .Length[0] = ( sizeof ( efi_dummy_parent_path.bbs ) +
66  sizeof ( efi_dummy_parent_path.tring )),
67  },
68  .DeviceType = BBS_TYPE_UNKNOWN,
69  .String[0] = 'i',
70  },
71  .tring = "PXE",
72  .end = {
73  .Type = END_DEVICE_PATH_TYPE,
75  .Length[0] = sizeof ( efi_dummy_parent_path.end ),
76  },
77 };
78 
79 /** An EFI device path settings block */
81  /** Settings interface */
83  /** Device path */
85 };
86 
87 /** An EFI device path setting */
89  /** Setting */
90  const struct setting *setting;
91  /**
92  * Fetch setting
93  *
94  * @v pathset Path setting
95  * @v path Device path
96  * @v data Buffer to fill with setting data
97  * @v len Length of buffer
98  * @ret len Length of setting data, or negative error
99  */
100  int ( * fetch ) ( struct efi_path_setting *pathset,
102  void *data, size_t len );
103  /** Path type */
105  /** Path subtype */
107  /** Offset within device path */
109  /** Length (if fixed) */
111 };
112 
113 /**
114  * Find next element in device path
115  *
116  * @v path Device path, or NULL
117  * @v next Next element in device path, or NULL if at end
118  */
120 
121  /* Check for non-existent device path */
122  if ( ! path )
123  return NULL;
124 
125  /* Check for end of device path */
126  if ( path->Type == END_DEVICE_PATH_TYPE )
127  return NULL;
128 
129  /* Move to next component of the device path */
130  path = ( ( ( void * ) path ) +
131  /* There's this amazing new-fangled thing known as
132  * a UINT16, but who wants to use one of those? */
133  ( ( path->Length[1] << 8 ) | path->Length[0] ) );
134 
135  return path;
136 }
137 
138 /**
139  * Find previous element of device path
140  *
141  * @v path Device path, or NULL for no path
142  * @v curr Current element in device path, or NULL for end of path
143  * @ret prev Previous element in device path, or NULL
144  */
146  EFI_DEVICE_PATH_PROTOCOL *curr ) {
148 
149  /* Find immediately preceding element */
150  while ( ( tmp = efi_path_next ( path ) ) != curr ) {
151  path = tmp;
152  }
153 
154  return path;
155 }
156 
157 /**
158  * Find end of device path
159  *
160  * @v path Device path, or NULL
161  * @ret path_end End of device path, or NULL
162  */
164 
165  return efi_path_prev ( path, NULL );
166 }
167 
168 /**
169  * Find length of device path (excluding terminator)
170  *
171  * @v path Device path, or NULL
172  * @ret path_len Length of device path
173  */
176 
177  return ( ( ( void * ) end ) - ( ( void * ) path ) );
178 }
179 
180 /**
181  * Check that device path is well-formed
182  *
183  * @v path Device path, or NULL
184  * @v max Maximum device path length
185  * @ret rc Return status code
186  */
189  size_t remaining = max;
190  size_t len;
191 
192  /* Check that path terminates within maximum length */
193  for ( ; ; path = next ) {
194  if ( remaining < sizeof ( *path ) )
195  return -EINVAL;
196  next = efi_path_next ( path );
197  if ( ! next )
198  break;
199  len = ( ( ( void * ) next ) - ( ( void * ) path ) );
200  if ( remaining < len )
201  return -EINVAL;
202  }
203 
204  return 0;
205 }
206 
207 /**
208  * Get MAC address from device path
209  *
210  * @v path Device path
211  * @ret mac MAC address, or NULL if not found
212  */
216 
217  /* Search for MAC address path */
218  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
219  if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
220  ( path->SubType == MSG_MAC_ADDR_DP ) ) {
222  Header );
223  return &mac->MacAddress;
224  }
225  }
226 
227  /* No MAC address found */
228  return NULL;
229 }
230 
231 /**
232  * Get VLAN tag from device path
233  *
234  * @v path Device path
235  * @ret tag VLAN tag, or 0 if not a VLAN
236  */
237 unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path ) {
239  VLAN_DEVICE_PATH *vlan;
240 
241  /* Search for VLAN device path */
242  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
243  if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
244  ( path->SubType == MSG_VLAN_DP ) ) {
245  vlan = container_of ( path, VLAN_DEVICE_PATH, Header );
246  return vlan->VlanId;
247  }
248  }
249 
250  /* No VLAN device path found */
251  return 0;
252 }
253 
254 /**
255  * Get partition GUID from device path
256  *
257  * @v path Device path
258  * @v guid Partition GUID to fill in
259  * @ret rc Return status code
260  */
264  int rc;
265 
266  /* Search for most specific partition device path */
267  rc = -ENOENT;
268  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
269 
270  /* Skip non-harddrive device paths */
271  if ( path->Type != MEDIA_DEVICE_PATH )
272  continue;
273  if ( path->SubType != MEDIA_HARDDRIVE_DP )
274  continue;
275 
276  /* Skip non-GUID signatures */
277  hd = container_of ( path, HARDDRIVE_DEVICE_PATH, Header );
278  if ( hd->SignatureType != SIGNATURE_TYPE_GUID )
279  continue;
280 
281  /* Extract GUID */
282  memcpy ( guid, hd->Signature, sizeof ( *guid ) );
283  uuid_mangle ( guid );
284 
285  /* Record success, but continue searching in case
286  * there exists a more specific GUID (e.g. a partition
287  * GUID rather than a disk GUID).
288  */
289  rc = 0;
290  }
291 
292  return rc;
293 }
294 
295 /**
296  * Parse URI from device path
297  *
298  * @v path Device path
299  * @ret uri URI, or NULL if not a URI
300  */
303  URI_DEVICE_PATH *uripath;
304  char *uristring;
305  struct uri *uri;
306  size_t len;
307 
308  /* Search for URI device path */
309  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
310  if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
311  ( path->SubType == MSG_URI_DP ) ) {
312 
313  /* Calculate path length */
314  uripath = container_of ( path, URI_DEVICE_PATH,
315  Header );
316  len = ( ( ( path->Length[1] << 8 ) | path->Length[0] )
317  - offsetof ( typeof ( *uripath ), Uri ) );
318 
319  /* Parse URI */
320  uristring = zalloc ( len + 1 /* NUL */ );
321  if ( ! uristring )
322  return NULL;
323  memcpy ( uristring, uripath->Uri, len );
324  uri = parse_uri ( uristring );
325  free ( uristring );
326 
327  return uri;
328  }
329  }
330 
331  /* No URI path found */
332  return NULL;
333 }
334 
335 /**
336  * Concatenate EFI device paths
337  *
338  * @v ... List of device paths (NULL terminated)
339  * @ret path Concatenated device path, or NULL on error
340  *
341  * The caller is responsible for eventually calling free() on the
342  * allocated device path.
343  */
349  va_list args;
350  size_t len;
351 
352  /* Calculate device path length */
353  va_start ( args, first );
354  len = 0;
355  src = first;
356  while ( src ) {
357  len += efi_path_len ( src );
358  src = va_arg ( args, EFI_DEVICE_PATH_PROTOCOL * );
359  }
360  va_end ( args );
361 
362  /* Allocate device path */
363  path = zalloc ( len + sizeof ( *end ) );
364  if ( ! path )
365  return NULL;
366 
367  /* Populate device path */
368  va_start ( args, first );
369  dst = path;
370  src = first;
371  while ( src ) {
372  len = efi_path_len ( src );
373  memcpy ( dst, src, len );
374  dst = ( ( ( void * ) dst ) + len );
375  src = va_arg ( args, EFI_DEVICE_PATH_PROTOCOL * );
376  }
377  va_end ( args );
378  end = dst;
380 
381  return path;
382 }
383 
384 /**
385  * Construct EFI parent device path
386  *
387  * @v dev Generic device
388  * @ret path Parent (or dummy) device path
389  */
391  struct efi_device *efidev;
392 
393  /* Use EFI parent device's path, if possible */
394  efidev = efidev_parent ( dev );
395  if ( efidev )
396  return efidev->path;
397 
398  /* Otherwise, use a dummy parent device path */
399  return &efi_dummy_parent_path.bbs.Header;
400 }
401 
402 /**
403  * Construct EFI device path for network device
404  *
405  * @v netdev Network device
406  * @ret path EFI device path, or NULL on error
407  *
408  * The caller is responsible for eventually calling free() on the
409  * allocated device path.
410  */
412  EFI_DEVICE_PATH_PROTOCOL *parent;
414  MAC_ADDR_DEVICE_PATH *macpath;
415  VLAN_DEVICE_PATH *vlanpath;
417  unsigned int tag;
418  size_t prefix_len;
419  size_t len;
420 
421  /* Get parent EFI device path */
422  parent = efi_parent_path ( netdev->dev );
423 
424  /* Calculate device path length */
425  prefix_len = efi_path_len ( parent );
426  len = ( prefix_len + sizeof ( *macpath ) + sizeof ( *vlanpath ) +
427  sizeof ( *end ) );
428 
429  /* Allocate device path */
430  path = zalloc ( len );
431  if ( ! path )
432  return NULL;
433 
434  /* Construct device path */
435  memcpy ( path, parent, prefix_len );
436  macpath = ( ( ( void * ) path ) + prefix_len );
437  macpath->Header.Type = MESSAGING_DEVICE_PATH;
438  macpath->Header.SubType = MSG_MAC_ADDR_DP;
439  macpath->Header.Length[0] = sizeof ( *macpath );
441  sizeof ( macpath->MacAddress ) );
442  memcpy ( &macpath->MacAddress, netdev->ll_addr,
444  macpath->IfType = ntohs ( netdev->ll_protocol->ll_proto );
445  if ( ( tag = vlan_tag ( netdev ) ) ) {
446  vlanpath = ( ( ( void * ) macpath ) + sizeof ( *macpath ) );
447  vlanpath->Header.Type = MESSAGING_DEVICE_PATH;
448  vlanpath->Header.SubType = MSG_VLAN_DP;
449  vlanpath->Header.Length[0] = sizeof ( *vlanpath );
450  vlanpath->VlanId = tag;
451  end = ( ( ( void * ) vlanpath ) + sizeof ( *vlanpath ) );
452  } else {
453  end = ( ( ( void * ) macpath ) + sizeof ( *macpath ) );
454  }
456 
457  return path;
458 }
459 
460 /**
461  * Construct EFI device path for URI
462  *
463  * @v uri URI
464  * @ret path EFI device path, or NULL on error
465  *
466  * The caller is responsible for eventually calling free() on the
467  * allocated device path.
468  */
472  URI_DEVICE_PATH *uripath;
473  size_t uri_len;
474  size_t uripath_len;
475  size_t len;
476 
477  /* Calculate device path length */
478  uri_len = ( format_uri ( uri, NULL, 0 ) + 1 /* NUL */ );
479  uripath_len = ( sizeof ( *uripath ) + uri_len );
480  len = ( uripath_len + sizeof ( *end ) );
481 
482  /* Allocate device path */
483  path = zalloc ( len );
484  if ( ! path )
485  return NULL;
486 
487  /* Construct device path */
488  uripath = ( ( void * ) path );
489  uripath->Header.Type = MESSAGING_DEVICE_PATH;
490  uripath->Header.SubType = MSG_URI_DP;
491  uripath->Header.Length[0] = ( uripath_len & 0xff );
492  uripath->Header.Length[1] = ( uripath_len >> 8 );
493  format_uri ( uri, uripath->Uri, uri_len );
494  end = ( ( ( void * ) path ) + uripath_len );
496 
497  return path;
498 }
499 
500 /**
501  * Construct EFI device path for iSCSI device
502  *
503  * @v iscsi iSCSI session
504  * @ret path EFI device path, or NULL on error
505  */
507  struct sockaddr_tcpip *st_target;
508  struct net_device *netdev;
509  EFI_DEVICE_PATH_PROTOCOL *netpath;
512  ISCSI_DEVICE_PATH *iscsipath;
513  char *name;
514  size_t prefix_len;
515  size_t name_len;
516  size_t iscsi_len;
517  size_t len;
518 
519  /* Get network device associated with target address */
520  st_target = ( ( struct sockaddr_tcpip * ) &iscsi->target_sockaddr );
521  netdev = tcpip_netdev ( st_target );
522  if ( ! netdev )
523  goto err_netdev;
524 
525  /* Get network device path */
526  netpath = efi_netdev_path ( netdev );
527  if ( ! netpath )
528  goto err_netpath;
529 
530  /* Calculate device path length */
531  prefix_len = efi_path_len ( netpath );
532  name_len = ( strlen ( iscsi->target_iqn ) + 1 /* NUL */ );
533  iscsi_len = ( sizeof ( *iscsipath ) + name_len );
534  len = ( prefix_len + iscsi_len + sizeof ( *end ) );
535 
536  /* Allocate device path */
537  path = zalloc ( len );
538  if ( ! path )
539  goto err_alloc;
540 
541  /* Construct device path */
542  memcpy ( path, netpath, prefix_len );
543  iscsipath = ( ( ( void * ) path ) + prefix_len );
544  iscsipath->Header.Type = MESSAGING_DEVICE_PATH;
545  iscsipath->Header.SubType = MSG_ISCSI_DP;
546  iscsipath->Header.Length[0] = iscsi_len;
548  memcpy ( &iscsipath->Lun, &iscsi->lun, sizeof ( iscsipath->Lun ) );
549  name = ( ( ( void * ) iscsipath ) + sizeof ( *iscsipath ) );
550  memcpy ( name, iscsi->target_iqn, name_len );
551  end = ( ( ( void * ) name ) + name_len );
553 
554  /* Free temporary paths */
555  free ( netpath );
556 
557  return path;
558 
559  err_alloc:
560  free ( netpath );
561  err_netpath:
562  err_netdev:
563  return NULL;
564 }
565 
566 /**
567  * Construct EFI device path for AoE device
568  *
569  * @v aoedev AoE device
570  * @ret path EFI device path, or NULL on error
571  */
573  struct {
574  SATA_DEVICE_PATH sata;
576  } satapath;
577  EFI_DEVICE_PATH_PROTOCOL *netpath;
579 
580  /* Get network device path */
581  netpath = efi_netdev_path ( aoedev->netdev );
582  if ( ! netpath )
583  goto err_netdev;
584 
585  /* Construct SATA path */
586  memset ( &satapath, 0, sizeof ( satapath ) );
587  satapath.sata.Header.Type = MESSAGING_DEVICE_PATH;
588  satapath.sata.Header.SubType = MSG_SATA_DP;
589  satapath.sata.Header.Length[0] = sizeof ( satapath.sata );
590  satapath.sata.HBAPortNumber = aoedev->major;
591  satapath.sata.PortMultiplierPortNumber = aoedev->minor;
592  efi_path_terminate ( &satapath.end );
593 
594  /* Construct overall device path */
595  path = efi_paths ( netpath, &satapath, NULL );
596  if ( ! path )
597  goto err_paths;
598 
599  /* Free temporary paths */
600  free ( netpath );
601 
602  return path;
603 
604  err_paths:
605  free ( netpath );
606  err_netdev:
607  return NULL;
608 }
609 
610 /**
611  * Construct EFI device path for Fibre Channel device
612  *
613  * @v desc FCP device description
614  * @ret path EFI device path, or NULL on error
615  */
617  struct {
620  } __attribute__ (( packed )) *path;
621 
622  /* Allocate device path */
623  path = zalloc ( sizeof ( *path ) );
624  if ( ! path )
625  return NULL;
626 
627  /* Construct device path */
628  path->fc.Header.Type = MESSAGING_DEVICE_PATH;
629  path->fc.Header.SubType = MSG_FIBRECHANNELEX_DP;
630  path->fc.Header.Length[0] = sizeof ( path->fc );
631  memcpy ( path->fc.WWN, &desc->wwn, sizeof ( path->fc.WWN ) );
632  memcpy ( path->fc.Lun, &desc->lun, sizeof ( path->fc.Lun ) );
633  efi_path_terminate ( &path->end );
634 
635  return &path->fc.Header;
636 }
637 
638 /**
639  * Construct EFI device path for Infiniband SRP device
640  *
641  * @v ib_srp Infiniband SRP device
642  * @ret path EFI device path, or NULL on error
643  */
645  const struct ipxe_ib_sbft *sbft = &ib_srp->sbft;
646  union ib_srp_target_port_id *id =
648  srp );
649  EFI_DEVICE_PATH_PROTOCOL *parent;
651  INFINIBAND_DEVICE_PATH *ibpath;
653  size_t prefix_len;
654  size_t len;
655 
656  /* Get parent EFI device path */
657  parent = efi_parent_path ( ib_srp->ibdev->dev );
658 
659  /* Calculate device path length */
660  prefix_len = efi_path_len ( parent );
661  len = ( prefix_len + sizeof ( *ibpath ) + sizeof ( *end ) );
662 
663  /* Allocate device path */
664  path = zalloc ( len );
665  if ( ! path )
666  return NULL;
667 
668  /* Construct device path */
669  memcpy ( path, parent, prefix_len );
670  ibpath = ( ( ( void * ) path ) + prefix_len );
672  ibpath->Header.SubType = MSG_INFINIBAND_DP;
673  ibpath->Header.Length[0] = sizeof ( *ibpath );
675  memcpy ( ibpath->PortGid, &sbft->ib.dgid, sizeof ( ibpath->PortGid ) );
676  memcpy ( &ibpath->ServiceId, &sbft->ib.service_id,
677  sizeof ( ibpath->ServiceId ) );
678  memcpy ( &ibpath->TargetPortId, &id->ib.ioc_guid,
679  sizeof ( ibpath->TargetPortId ) );
680  memcpy ( &ibpath->DeviceId, &id->ib.id_ext,
681  sizeof ( ibpath->DeviceId ) );
682  end = ( ( ( void * ) ibpath ) + sizeof ( *ibpath ) );
684 
685  return path;
686 }
687 
688 /**
689  * Construct EFI device path for USB function
690  *
691  * @v func USB function
692  * @ret path EFI device path, or NULL on error
693  *
694  * The caller is responsible for eventually calling free() on the
695  * allocated device path.
696  */
698  struct usb_device *usb = func->usb;
699  EFI_DEVICE_PATH_PROTOCOL *parent;
702  USB_DEVICE_PATH *usbpath;
703  unsigned int count;
704  size_t prefix_len;
705  size_t len;
706 
707  /* Sanity check */
708  assert ( func->desc.count >= 1 );
709 
710  /* Get parent EFI device path */
711  parent = efi_parent_path ( &func->dev );
712 
713  /* Calculate device path length */
714  count = ( usb_depth ( usb ) + 1 );
715  prefix_len = efi_path_len ( parent );
716  len = ( prefix_len + ( count * sizeof ( *usbpath ) ) +
717  sizeof ( *end ) );
718 
719  /* Allocate device path */
720  path = zalloc ( len );
721  if ( ! path )
722  return NULL;
723 
724  /* Construct device path */
725  memcpy ( path, parent, prefix_len );
726  end = ( ( ( void * ) path ) + len - sizeof ( *end ) );
728  usbpath = ( ( ( void * ) end ) - sizeof ( *usbpath ) );
729  usbpath->InterfaceNumber = func->interface[0];
730  for ( ; usb ; usbpath--, usb = usb->port->hub->usb ) {
731  usbpath->Header.Type = MESSAGING_DEVICE_PATH;
732  usbpath->Header.SubType = MSG_USB_DP;
733  usbpath->Header.Length[0] = sizeof ( *usbpath );
734  usbpath->ParentPortNumber = ( usb->port->address - 1 );
735  }
736 
737  return path;
738 }
739 
740 /**
741  * Get EFI device path from load option
742  *
743  * @v load EFI load option
744  * @v len Length of EFI load option
745  * @ret path EFI device path, or NULL on error
746  *
747  * The caller is responsible for eventually calling free() on the
748  * allocated device path.
749  */
751  size_t len ) {
754  CHAR16 *wdesc;
755  size_t path_max;
756  size_t wmax;
757  size_t wlen;
758 
759  /* Check basic structure size */
760  if ( len < sizeof ( *load ) ) {
761  DBGC ( load, "EFI load option too short for header:\n" );
762  DBGC_HDA ( load, 0, load, len );
763  return NULL;
764  }
765 
766  /* Get length of description */
767  wdesc = ( ( ( void * ) load ) + sizeof ( *load ) );
768  wmax = ( ( len - sizeof ( *load ) ) / sizeof ( wdesc[0] ) );
769  wlen = wcsnlen ( wdesc, wmax );
770  if ( wlen == wmax ) {
771  DBGC ( load, "EFI load option has unterminated "
772  "description:\n" );
773  DBGC_HDA ( load, 0, load, len );
774  return NULL;
775  }
776 
777  /* Get inline device path */
778  path = ( ( ( void * ) load ) + sizeof ( *load ) +
779  ( wlen * sizeof ( wdesc[0] ) ) + 2 /* wNUL */ );
780  path_max = ( len - sizeof ( *load ) - ( wlen * sizeof ( wdesc[0] ) )
781  - 2 /* wNUL */ );
782  if ( load->FilePathListLength > path_max ) {
783  DBGC ( load, "EFI load option too short for path(s):\n" );
784  DBGC_HDA ( load, 0, load, len );
785  return NULL;
786  }
787 
788  /* Check path length */
789  if ( efi_path_check ( path, path_max ) != 0 ) {
790  DBGC ( load, "EFI load option has unterminated device "
791  "path:\n" );
792  DBGC_HDA ( load, 0, load, len );
793  return NULL;
794  }
795 
796  /* Allocate copy of path */
797  copy = malloc ( path_max );
798  if ( ! copy )
799  return NULL;
800  memcpy ( copy, path, path_max );
801 
802  return copy;
803 }
804 
805 /**
806  * Get EFI device path for numbered boot option
807  *
808  * @v number Boot option number
809  * @ret path EFI device path, or NULL on error
810  *
811  * The caller is responsible for eventually calling free() on the
812  * allocated device path.
813  */
814 EFI_DEVICE_PATH_PROTOCOL * efi_boot_path ( unsigned int number ) {
817  CHAR16 wname[ 9 /* "BootXXXX" + wNUL */ ];
818  EFI_LOAD_OPTION *load;
819  EFI_DEVICE_PATH *path;
820  UINT32 attrs;
821  UINTN size;
822  EFI_STATUS efirc;
823  int rc;
824 
825  /* Construct variable name */
826  efi_snprintf ( wname, ( sizeof ( wname ) / sizeof ( wname[0] ) ),
827  "Boot%04X", number );
828 
829  /* Get variable length */
830  size = 0;
831  if ( ( efirc = rs->GetVariable ( wname, guid, &attrs, &size,
832  NULL ) != EFI_BUFFER_TOO_SMALL ) ) {
833  rc = -EEFI ( efirc );
834  DBGC ( rs, "EFI could not get size of %ls: %s\n",
835  wname, strerror ( rc ) );
836  goto err_size;
837  }
838 
839  /* Allocate temporary buffer for EFI_LOAD_OPTION */
840  load = malloc ( size );
841  if ( ! load ) {
842  rc = -ENOMEM;
843  goto err_alloc;
844  }
845 
846  /* Read variable */
847  if ( ( efirc = rs->GetVariable ( wname, guid, &attrs, &size,
848  load ) != 0 ) ) {
849  rc = -EEFI ( efirc );
850  DBGC ( rs, "EFI could not read %ls: %s\n",
851  wname, strerror ( rc ) );
852  goto err_read;
853  }
854  DBGC2 ( rs, "EFI boot option %ls is:\n", wname );
855  DBGC2_HDA ( rs, 0, load, size );
856 
857  /* Get device path from load option */
858  path = efi_load_path ( load, size );
859  if ( ! path ) {
860  rc = -EINVAL;
861  DBGC ( rs, "EFI could not parse %ls: %s\n",
862  wname, strerror ( rc ) );
863  goto err_path;
864  }
865 
866  /* Free temporary buffer */
867  free ( load );
868 
869  return path;
870 
871  err_path:
872  err_read:
873  free ( load );
874  err_alloc:
875  err_size:
876  return NULL;
877 }
878 
879 /**
880  * Get EFI device path for current boot option
881  *
882  * @ret path EFI device path, or NULL on error
883  *
884  * The caller is responsible for eventually calling free() on the
885  * allocated device path.
886  */
890  CHAR16 wname[] = L"BootCurrent";
891  UINT16 current;
892  UINT32 attrs;
893  UINTN size;
894  EFI_STATUS efirc;
895  int rc;
896 
897  /* Read current boot option index */
898  size = sizeof ( current );
899  if ( ( efirc = rs->GetVariable ( wname, guid, &attrs, &size,
900  &current ) != 0 ) ) {
901  rc = -EEFI ( efirc );
902  DBGC ( rs, "EFI could not read %ls: %s\n",
903  wname, strerror ( rc ) );
904  return NULL;
905  }
906 
907  /* Get device path from this boot option */
908  return efi_boot_path ( current );
909 }
910 
911 /**
912  * Describe object as an EFI device path
913  *
914  * @v intf Interface
915  * @ret path EFI device path, or NULL
916  *
917  * The caller is responsible for eventually calling free() on the
918  * allocated device path.
919  */
921  struct interface *dest;
922  efi_describe_TYPE ( void * ) *op =
924  void *object = intf_object ( dest );
926 
927  if ( op ) {
928  path = op ( object );
929  } else {
930  path = NULL;
931  }
932 
933  intf_put ( dest );
934  return path;
935 }
936 
937 /**
938  * Fetch an EFI device path fixed-size setting
939  *
940  * @v pathset Path setting
941  * @v path Device path
942  * @v data Buffer to fill with setting data
943  * @v len Length of buffer
944  * @ret len Length of setting data, or negative error
945  */
946 static int efi_path_fetch_fixed ( struct efi_path_setting *pathset,
948  void *data, size_t len ) {
949 
950  /* Copy data */
951  if ( len > pathset->len )
952  len = pathset->len;
953  memcpy ( data, ( ( ( void * ) path ) + pathset->offset ), len );
954 
955  return pathset->len;
956 }
957 
958 /**
959  * Fetch an EFI device path DNS setting
960  *
961  * @v pathset Path setting
962  * @v path Device path
963  * @v data Buffer to fill with setting data
964  * @v len Length of buffer
965  * @ret len Length of setting data, or negative error
966  */
967 static int efi_path_fetch_dns ( struct efi_path_setting *pathset,
969  void *data, size_t len ) {
971  unsigned int count;
972  unsigned int i;
973  size_t frag_len;
974 
975  /* Check applicability */
976  if ( ( !! dns->IsIPv6 ) !=
977  ( pathset->setting->type == &setting_type_ipv6 ) )
978  return -ENOENT;
979 
980  /* Calculate number of addresses */
981  count = ( ( ( ( path->Length[1] << 8 ) | path->Length[0] ) -
982  pathset->offset ) / sizeof ( dns->DnsServerIp[0] ) );
983 
984  /* Copy data */
985  for ( i = 0 ; i < count ; i++ ) {
986  frag_len = len;
987  if ( frag_len > pathset->len )
988  frag_len = pathset->len;
989  memcpy ( data, &dns->DnsServerIp[i], frag_len );
990  data += frag_len;
991  len -= frag_len;
992  }
993 
994  return ( count * pathset->len );
995 }
996 
997 /** EFI device path settings */
1000  MSG_IPv4_DP, offsetof ( IPv4_DEVICE_PATH, LocalIpAddress ),
1001  sizeof ( struct in_addr ) },
1002  { &netmask_setting, efi_path_fetch_fixed, MESSAGING_DEVICE_PATH,
1003  MSG_IPv4_DP, offsetof ( IPv4_DEVICE_PATH, SubnetMask ),
1004  sizeof ( struct in_addr ) },
1005  { &gateway_setting, efi_path_fetch_fixed, MESSAGING_DEVICE_PATH,
1006  MSG_IPv4_DP, offsetof ( IPv4_DEVICE_PATH, GatewayIpAddress ),
1007  sizeof ( struct in_addr ) },
1009  MSG_IPv6_DP, offsetof ( IPv6_DEVICE_PATH, LocalIpAddress ),
1010  sizeof ( struct in6_addr ) },
1011  { &len6_setting, efi_path_fetch_fixed, MESSAGING_DEVICE_PATH,
1012  MSG_IPv6_DP, offsetof ( IPv6_DEVICE_PATH, PrefixLength ),
1013  sizeof ( uint8_t ) },
1014  { &gateway6_setting, efi_path_fetch_fixed, MESSAGING_DEVICE_PATH,
1015  MSG_IPv6_DP, offsetof ( IPv6_DEVICE_PATH, GatewayIpAddress ),
1016  sizeof ( struct in6_addr ) },
1017  { &dns_setting, efi_path_fetch_dns, MESSAGING_DEVICE_PATH,
1018  MSG_DNS_DP, offsetof ( DNS_DEVICE_PATH, DnsServerIp ),
1019  sizeof ( struct in_addr ) },
1020  { &dns6_setting, efi_path_fetch_dns, MESSAGING_DEVICE_PATH,
1021  MSG_DNS_DP, offsetof ( DNS_DEVICE_PATH, DnsServerIp ),
1022  sizeof ( struct in6_addr ) },
1023 };
1024 
1025 /**
1026  * Fetch value of EFI device path setting
1027  *
1028  * @v settings Settings block
1029  * @v setting Setting to fetch
1030  * @v data Buffer to fill with setting data
1031  * @v len Length of buffer
1032  * @ret len Length of setting data, or negative error
1033  */
1034 static int efi_path_fetch ( struct settings *settings, struct setting *setting,
1035  void *data, size_t len ) {
1036  struct efi_path_settings *pathsets =
1038  EFI_DEVICE_PATH_PROTOCOL *path = pathsets->path;
1040  struct efi_path_setting *pathset;
1041  unsigned int i;
1042  int ret;
1043 
1044  /* Find matching path setting, if any */
1045  for ( i = 0 ; i < ( sizeof ( efi_path_settings ) /
1046  sizeof ( efi_path_settings[0] ) ) ; i++ ) {
1047 
1048  /* Check for a matching setting */
1049  pathset = &efi_path_settings[i];
1050  if ( setting_cmp ( setting, pathset->setting ) != 0 )
1051  continue;
1052 
1053  /* Find matching device path element, if any */
1054  for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
1055 
1056  /* Check for a matching path type */
1057  if ( ( path->Type != pathset->type ) ||
1058  ( path->SubType != pathset->subtype ) )
1059  continue;
1060 
1061  /* Fetch value */
1062  if ( ( ret = pathset->fetch ( pathset, path,
1063  data, len ) ) < 0 )
1064  return ret;
1065 
1066  /* Apply default type, if not already set */
1067  if ( ! setting->type )
1068  setting->type = pathset->setting->type;
1069 
1070  return ret;
1071  }
1072  break;
1073  }
1074 
1075  return -ENOENT;
1076 }
1077 
1078 /** EFI device path settings operations */
1080  .fetch = efi_path_fetch,
1081 };
1082 
1083 /**
1084  * Create per-netdevice EFI path settings
1085  *
1086  * @v netdev Network device
1087  * @v priv Private data
1088  * @ret rc Return status code
1089  */
1090 static int efi_path_net_probe ( struct net_device *netdev, void *priv ) {
1091  struct efi_path_settings *pathsets = priv;
1092  struct settings *settings = &pathsets->settings;
1094  unsigned int vlan;
1095  void *mac;
1096  int rc;
1097 
1098  /* Check applicability */
1099  pathsets->path = path;
1100  mac = efi_path_mac ( path );
1101  vlan = efi_path_vlan ( path );
1102  if ( ( mac == NULL ) ||
1103  ( memcmp ( mac, netdev->ll_addr,
1104  netdev->ll_protocol->ll_addr_len ) != 0 ) ||
1105  ( vlan != vlan_tag ( netdev ) ) ) {
1106  DBGC ( settings, "EFI path %s does not apply to %s\n",
1107  efi_devpath_text ( path ), netdev->name );
1108  return 0;
1109  }
1110 
1111  /* Never override a real DHCP settings block */
1113  DHCP_SETTINGS_NAME ) ) {
1114  DBGC ( settings, "EFI path %s not overriding %s DHCP "
1115  "settings\n", efi_devpath_text ( path ), netdev->name );
1116  return 0;
1117  }
1118 
1119  /* Initialise and register settings */
1121  &netdev->refcnt, NULL );
1123  DHCP_SETTINGS_NAME ) ) != 0 ) {
1124  DBGC ( settings, "EFI path %s could not register for %s: %s\n",
1125  efi_devpath_text ( path ), netdev->name,
1126  strerror ( rc ) );
1127  return rc;
1128  }
1129  DBGC ( settings, "EFI path %s registered for %s\n",
1130  efi_devpath_text ( path ), netdev->name );
1131 
1132  return 0;
1133 }
1134 
1135 /** EFI path settings per-netdevice driver */
1136 struct net_driver efi_path_net_driver __net_driver = {
1137  .name = "EFI path",
1138  .priv_len = sizeof ( struct efi_path_settings ),
1139  .probe = efi_path_net_probe,
1140 };
#define BBS_BBS_DP
BIOS Boot Specification Device Path SubType.
Definition: DevicePath.h:1241
static int efi_path_fetch(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of EFI device path setting.
Definition: efi_path.c:1034
#define MSG_FIBRECHANNELEX_DP
Fibre Channel Ex SubType.
Definition: DevicePath.h:385
#define __attribute__(x)
Definition: compiler.h:10
#define EINVAL
Invalid argument.
Definition: errno.h:429
TCP/IP socket address.
Definition: tcpip.h:76
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
const char * name
Definition: ath9k_hw.c:1986
unsigned int efi_path_vlan(EFI_DEVICE_PATH_PROTOCOL *path)
Get VLAN tag from device path.
Definition: efi_path.c:237
union srp_port_id srp
SRP version of port identifier.
Definition: ib_srp.h:35
Dynamic Host Configuration Protocol.
#define va_end(ap)
Definition: stdarg.h:10
UINT16 FilePathListLength
Length in bytes of the FilePathList.
Definition: UefiSpec.h:2149
struct net_device * tcpip_netdev(struct sockaddr_tcpip *st_dest)
Determine transmitting network device.
Definition: tcpip.c:115
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:175
#define max(x, y)
Definition: ath.h:41
#define ISCSI_LOGIN_OPTION_AUTHMETHOD_NON
Definition: DevicePath.h:960
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:199
EFI driver interface.
struct ipxe_ib_sbft sbft
Boot firmware table parameters.
Definition: ib_srp.h:91
uint8_t interface[0]
List of interface numbers.
Definition: usb.h:697
An iSCSI session.
Definition: iscsi.h:545
static EFI_DEVICE_PATH_PROTOCOL * efi_parent_path(struct device *dev)
Construct EFI parent device path.
Definition: efi_path.c:390
size_t wcsnlen(const wchar_t *string, size_t max)
Calculate length of wide-character string.
Definition: wchar.c:43
#define END_DEVICE_PATH_TYPE
Definition: DevicePath.h:1394
struct sockaddr target_sockaddr
Target socket address (for boot firmware table)
Definition: iscsi.h:662
uint8_t offset
Offset within device path.
Definition: efi_path.c:108
unsigned int count
Number of interfaces.
Definition: usb.h:665
128 bit buffer containing a unique identifier value.
Definition: Base.h:216
uint32_t first
First block in range.
Definition: pccrr.h:15
Error codes.
UINT8 IfType
Network interface type(i.e.
Definition: DevicePath.h:563
A universally unique ID.
Definition: uuid.h:16
int(* fetch)(struct efi_path_setting *pathset, EFI_DEVICE_PATH_PROTOCOL *path, void *data, size_t len)
Fetch setting.
Definition: efi_path.c:100
UINT8 SignatureType
Type of Disk Signature: (Unused values reserved).
Definition: DevicePath.h:1059
u16 fc
802.11 Frame Control field
Definition: ieee80211.h:14
#define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL
Definition: DevicePath.h:689
CHAR8 tring[4]
Definition: efi_path.c:58
EFI strings.
SRP target port identifier for Infiniband.
Definition: ib_srp.h:33
EFI_MAC_ADDRESS MacAddress
The MAC address for a network interface padded with 0s.
Definition: DevicePath.h:559
uint16_t size
Buffer size.
Definition: dwmac.h:14
uint16_t major
Major number.
Definition: aoe.h:126
#define DBGC(...)
Definition: compiler.h:505
EFI_DEVICE_PATH_PROTOCOL * path
Device path.
Definition: efi_path.c:84
#define BBS_TYPE_UNKNOWN
Definition: DevicePath.h:1272
#define ENOENT
No such file or directory.
Definition: errno.h:515
struct device * dev
Underlying device.
Definition: infiniband.h:411
union srp_port_id target
Target port identifier.
Definition: srp.h:820
unsigned int UINT32
Definition: ProcessorBind.h:99
static struct settings_operations efi_path_settings_operations
EFI device path settings operations.
Definition: efi_path.c:1079
Universally unique IDs.
struct settings settings
Settings interface.
Definition: efi_path.c:82
static int efi_path_fetch_fixed(struct efi_path_setting *pathset, EFI_DEVICE_PATH_PROTOCOL *path, void *data, size_t len)
Fetch an EFI device path fixed-size setting.
Definition: efi_path.c:946
#define MSG_MAC_ADDR_DP
MAC Address Device Path SubType.
Definition: DevicePath.h:553
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition: efi_path.c:174
unsigned short CHAR16
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:656
#define ntohs(value)
Definition: byteswap.h:137
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:555
struct net_driver efi_path_net_driver __net_driver
EFI path settings per-netdevice driver.
Definition: efi_path.c:1136
union ib_gid dgid
Destination GID.
Definition: ib_srp.h:52
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition: DevicePath.h:46
EFI_DEVICE_PATH_PROTOCOL * efi_uri_path(struct uri *uri)
Construct EFI device path for URI.
Definition: efi_path.c:469
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:25
uint8_t mac[ETH_ALEN]
MAC address.
Definition: ena.h:24
UINT16 LoginOption
iSCSI Login Options.
Definition: DevicePath.h:938
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:120
static struct @438 efi_dummy_parent_path
Dummy parent device path.
Uniform Resource Identifiers.
An EFI device path settings block.
Definition: efi_path.c:80
uint8_t type
Path type.
Definition: efi_path.c:104
EFI_DEVICE_PATH_PROTOCOL * efi_boot_path(unsigned int number)
Get EFI device path for numbered boot option.
Definition: efi_path.c:814
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition: DevicePath.h:324
An EFI device path setting.
Definition: efi_path.c:88
UINT32 ResourceFlags
Flags to help identify/manage InfiniBand device path elements: Bit 0 - IOC/Service (0b = IOC,...
Definition: DevicePath.h:666
A network upper-layer driver.
Definition: netdevice.h:477
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:587
static void settings_init(struct settings *settings, struct settings_operations *op, struct refcnt *refcnt, const struct settings_scope *default_scope)
Initialise a settings block.
Definition: settings.h:503
An AoE device.
Definition: aoe.h:116
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition: interface.c:160
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition: efi_path.h:31
EFI_DEVICE_PATH_PROTOCOL * efi_path_prev(EFI_DEVICE_PATH_PROTOCOL *path, EFI_DEVICE_PATH_PROTOCOL *curr)
Find previous element of device path.
Definition: efi_path.c:145
struct interface * intf
Original interface.
Definition: interface.h:159
static void uuid_mangle(union uuid *uuid)
Change UUID endianness.
Definition: uuid.h:44
EFI_DEVICE_PATH_PROTOCOL * efi_paths(EFI_DEVICE_PATH_PROTOCOL *first,...)
Concatenate EFI device paths.
Definition: efi_path.c:344
unsigned long tmp
Definition: linux_pci.h:65
struct ena_llq_option desc
Descriptor counts.
Definition: ena.h:20
EFI_IP_ADDRESS DnsServerIp[]
Instance of the DNS server address.
Definition: DevicePath.h:876
#define ENOMEM
Not enough space.
Definition: errno.h:535
A hardware device.
Definition: device.h:77
struct usb_device * usb
Underlying USB device, if any.
Definition: usb.h:847
#define MSG_URI_DP
Uniform Resource Identifiers (URI) Device Path SubType.
Definition: DevicePath.h:882
EFI_DEVICE_PATH_PROTOCOL * efi_loaded_image_path
Device path for the loaded image's device handle.
Definition: efi_init.c:42
AoE protocol.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
const char * name
Name.
Definition: netdevice.h:479
#define va_arg(ap, type)
Definition: stdarg.h:9
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:884
BBS_BBS_DEVICE_PATH bbs
Definition: efi_path.c:57
struct usb_port * port
USB port.
Definition: usb.h:727
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
Fibre Channel Protocol.
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:36
An object interface.
Definition: interface.h:125
static const void * src
Definition: string.h:48
EFI_DEVICE_PATH_PROTOCOL * efi_current_boot_path(void)
Get EFI device path for current boot option.
Definition: efi_path.c:887
#define MEDIA_HARDDRIVE_DP
Hard Drive Media Device Path SubType.
Definition: DevicePath.h:1017
#define DBGC_HDA(...)
Definition: compiler.h:506
int efi_path_check(EFI_DEVICE_PATH_PROTOCOL *path, size_t max)
Check that device path is well-formed.
Definition: efi_path.c:187
#define DHCP_SETTINGS_NAME
Settings block name used for DHCP responses.
Definition: dhcp.h:711
ring len
Length.
Definition: dwmac.h:231
struct sbft_srp_subtable srp
The SRP subtable.
Definition: ib_srp.h:70
const char * path
Path (after URI decoding)
Definition: uri.h:81
#define MSG_SATA_DP
SATA Device Path SubType.
Definition: DevicePath.h:513
iSCSI protocol
static struct net_device * netdev
Definition: gdbudp.c:52
UINT8 ParentPortNumber
USB Parent Port Number.
Definition: DevicePath.h:427
int efi_snprintf(wchar_t *wbuf, size_t wsize, const char *fmt,...)
Write a formatted string to a buffer.
Definition: efi_strings.c:107
This Device Path is used to describe the booting of non-EFI-aware operating systems.
Definition: DevicePath.h:1246
Transport-network layer interface.
static unsigned int count
Number of entries.
Definition: dwmac.h:225
void * efi_path_mac(EFI_DEVICE_PATH_PROTOCOL *path)
Get MAC address from device path.
Definition: efi_path.c:213
UINT16 VlanId
VLAN identifier (0-4094).
Definition: DevicePath.h:973
EFI_GUID efi_global_variable
Global variable GUID.
Definition: efi_guid.c:469
size_t format_uri(const struct uri *uri, char *buf, size_t len)
Format URI.
Definition: uri.c:472
const struct setting_type * type
Setting type.
Definition: settings.h:37
An Infiniband SRP sBFT created by iPXE.
Definition: ib_srp.h:64
IP6 address structure.
Definition: in.h:51
#define MSG_IPv4_DP
IPv4 Device Path SubType.
Definition: DevicePath.h:569
EFI_DEVICE_PATH_PROTOCOL * efi_fcp_path(struct fcp_description *desc)
Construct EFI device path for Fibre Channel device.
Definition: efi_path.c:616
EFI_GET_VARIABLE GetVariable
Definition: UefiSpec.h:1903
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition: efi_debug.c:247
UINT64 Lun
iSCSI Logical Unit Number.
Definition: DevicePath.h:942
#define BBS_DEVICE_PATH
BIOS Boot Specification Device Path.
Definition: DevicePath.h:1236
EFI_DEVICE_PATH_PROTOCOL end
Definition: efi_path.c:59
union ib_guid service_id
Service ID.
Definition: ib_srp.h:54
A USB device.
Definition: usb.h:723
uint8_t id
Request identifier.
Definition: ena.h:12
static unsigned int usb_depth(struct usb_device *usb)
Get USB depth.
Definition: usb.h:1269
CHAR8 Uri[]
Instance of the URI pursuant to RFC 3986.
Definition: DevicePath.h:888
unsigned short UINT16
EFI_DEVICE_PATH_PROTOCOL * efi_ib_srp_path(struct ib_srp_device *ib_srp)
Construct EFI device path for Infiniband SRP device.
Definition: efi_path.c:644
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:423
#define DBGC2_HDA(...)
Definition: compiler.h:523
Configuration settings.
EFI Runtime Services Table.
Definition: UefiSpec.h:1880
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path(struct net_device *netdev)
Construct EFI device path for network device.
Definition: efi_path.c:411
struct refcnt refcnt
Reference counter.
Definition: netdevice.h:355
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
EFI_DEVICE_PATH_PROTOCOL * efi_usb_path(struct usb_function *func)
Construct EFI device path for USB function.
Definition: efi_path.c:697
struct scsi_lun lun
SCSI LUN (for boot firmware table)
Definition: iscsi.h:664
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
IP address structure.
Definition: in.h:42
UINT8 InterfaceNumber
USB Interface Number.
Definition: DevicePath.h:431
static int efi_path_net_probe(struct net_device *netdev, void *priv)
Create per-netdevice EFI path settings.
Definition: efi_path.c:1090
A network device.
Definition: netdevice.h:353
#define MSG_ISCSI_DP
iSCSI Device Path SubType
Definition: DevicePath.h:928
#define MSG_IPv6_DP
IPv6 Device Path SubType.
Definition: DevicePath.h:610
size_t strlen(const char *src)
Get length of string.
Definition: string.c:244
Settings block operations.
Definition: settings.h:86
UINT64 DeviceId
64-bit persistent ID of remote device.
Definition: DevicePath.h:683
A settings block.
Definition: settings.h:133
#define MSG_INFINIBAND_DP
InfiniBand Device Path SubType.
Definition: DevicePath.h:654
unsigned char uint8_t
Definition: stdint.h:10
#define MSG_DNS_DP
DNS Device Path SubType.
Definition: DevicePath.h:866
EFI device paths.
#define MEDIA_DEVICE_PATH
Definition: DevicePath.h:1012
UINT64 UINTN
Unsigned value of native width.
An EFI device.
Definition: efi_driver.h:18
FILE_SECBOOT(PERMITTED)
struct usb_device * usb
USB device.
Definition: usb.h:678
An Infiniband SRP device.
Definition: ib_srp.h:76
uint16_t ll_proto
Link-layer protocol.
Definition: netdevice.h:195
uint32_t next
Next descriptor address.
Definition: dwmac.h:22
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:621
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition: efi_path.c:119
An FCP device description.
Definition: fcp.h:168
EFI_DEVICE_PATH_PROTOCOL * efi_iscsi_path(struct iscsi_session *iscsi)
Construct EFI device path for iSCSI device.
Definition: efi_path.c:506
static int efi_path_fetch_dns(struct efi_path_setting *pathset, EFI_DEVICE_PATH_PROTOCOL *path, void *data, size_t len)
Fetch an EFI device path DNS setting.
Definition: efi_path.c:967
uint8_t len
Length (if fixed)
Definition: efi_path.c:110
EFI API.
A setting.
Definition: settings.h:24
uint64_t guid
GUID.
Definition: edd.h:31
struct device * dev
Underlying hardware device.
Definition: netdevice.h:365
UINT64 TargetPortId
64-bit persistent ID of remote IOC port.
Definition: DevicePath.h:679
Network device management.
UINT8 Signature[16]
Signature unique to this partition: If SignatureType is 0, this field has to be initialized with 16 z...
Definition: DevicePath.h:1046
#define MSG_VLAN_DP
VLAN Device Path SubType.
Definition: DevicePath.h:967
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
UINT64 ServiceId
64-bit unique identifier to remote IOC or server process.
Definition: DevicePath.h:675
#define END_ENTIRE_DEVICE_PATH_SUBTYPE
Definition: DevicePath.h:1395
char * target_iqn
Target IQN.
Definition: iscsi.h:563
EFI_DEVICE_PATH_PROTOCOL * efi_describe(struct interface *intf)
Describe object as an EFI device path.
Definition: efi_path.c:920
EFI_RUNTIME_SERVICES * RuntimeServices
A pointer to the EFI Runtime Services Table.
Definition: UefiSpec.h:2095
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:363
static struct efi_path_setting efi_path_settings[]
EFI device path settings.
Definition: efi_path.c:998
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:969
UINT8 Length[2]
Specific Device Path data.
Definition: DevicePath.h:59
SCSI RDMA Protocol over Infiniband.
UINT8 PortGid[16]
128-bit Global Identifier for remote fabric port.
Definition: DevicePath.h:670
#define DBGC2(...)
Definition: compiler.h:522
static struct tlan_private * priv
Definition: tlan.c:225
__builtin_va_list va_list
Definition: stdarg.h:7
Universal Serial Bus (USB)
EFI_DEVICE_PATH_PROTOCOL * efi_aoe_path(struct aoe_device *aoedev)
Construct EFI device path for AoE device.
Definition: efi_path.c:572
struct uri * efi_path_uri(EFI_DEVICE_PATH_PROTOCOL *path)
Parse URI from device path.
Definition: efi_path.c:301
char CHAR8
struct ib_device * ibdev
Infiniband device.
Definition: ib_srp.h:86
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:32
struct usb_hub * hub
USB hub.
Definition: usb.h:815
UINT8 SubType
Varies by Type 0xFF End Entire Device Path, or 0x01 End This Instance of a Device Path and start a ne...
Definition: DevicePath.h:54
int(* fetch)(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of setting.
Definition: settings.h:123
The Hard Drive Media Device Path is used to represent a partition on a hard drive.
Definition: DevicePath.h:1022
const struct setting * setting
Setting.
Definition: efi_path.c:90
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition: interface.c:150
uint8_t minor
Minor number.
Definition: aoe.h:128
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:151
struct net_device * netdev
Network device.
Definition: aoe.h:121
uint8_t data[48]
Additional event data.
Definition: ena.h:22
Virtual LANs.
struct sbft_ib_subtable ib
The Infiniband subtable.
Definition: ib_srp.h:72
UINT8 Type
0x01 Hardware Device Path.
Definition: DevicePath.h:47
struct usb_function_descriptor desc
Function descriptor.
Definition: usb.h:680
A Uniform Resource Identifier.
Definition: uri.h:65
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition: settings.c:476
EFI_SYSTEM_TABLE * efi_systab
EFI_DEVICE_PATH_PROTOCOL * path
EFI device path copy.
Definition: efi_driver.h:26
struct efi_device * efidev_parent(struct device *dev)
Get parent EFI device.
Definition: efi_driver.c:129
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition: acpi.c:48
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:388
#define SIGNATURE_TYPE_GUID
Definition: DevicePath.h:1067
static unsigned int vlan_tag(struct net_device *netdev)
Get the VLAN tag.
Definition: vlan.h:74
#define va_start(ap, last)
Definition: stdarg.h:8
UINT8 IsIPv6
Indicates the DNS server address is IPv4 or IPv6 address.
Definition: DevicePath.h:872
struct settings * find_child_settings(struct settings *parent, const char *name)
Find child settings block.
Definition: settings.c:280
struct device dev
Generic device.
Definition: usb.h:682
A USB function.
Definition: usb.h:674
FILE_LICENCE(GPL2_OR_LATER)
uint64_t tag
Identity tag.
Definition: edd.h:31
struct device dev
Generic device.
Definition: efi_driver.h:20
EFI_DEVICE_PATH_PROTOCOL * efi_load_path(EFI_LOAD_OPTION *load, size_t len)
Get EFI device path from load option.
Definition: efi_path.c:750
uint8_t subtype
Path subtype.
Definition: efi_path.c:106
int setting_cmp(const struct setting *a, const struct setting *b)
Compare two settings.
Definition: settings.c:1121
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:115
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
String functions.
EFI_DEVICE_PATH_PROTOCOL * efi_path_end(EFI_DEVICE_PATH_PROTOCOL *path)
Find end of device path.
Definition: efi_path.c:163
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition: interface.h:270
int efi_path_guid(EFI_DEVICE_PATH_PROTOCOL *path, union uuid *guid)
Get partition GUID from device path.
Definition: efi_path.c:261
EFI_DEVICE_PATH_PROTOCOL Header
Definition: DevicePath.h:930
#define MSG_USB_DP
USB Device Path SubType.
Definition: DevicePath.h:421
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:373
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition: uri.c:297
void * memset(void *dest, int character, size_t len) __nonnull
PACKED union @541::@555 Header
Definition: Acpi10.h:156
#define efi_describe_TYPE(object_type)
Definition: efi_path.h:69