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
20FILE_LICENCE ( GPL2_OR_LATER );
21FILE_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>
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 */
56static 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 = {
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 */
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 */
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 */
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 */
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 */
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 );
438 macpath->Header.SubType = MSG_MAC_ADDR_DP;
439 macpath->Header.Length[0] = sizeof ( *macpath );
440 assert ( netdev->ll_protocol->ll_addr_len <
441 sizeof ( macpath->MacAddress ) );
442 memcpy ( &macpath->MacAddress, netdev->ll_addr,
443 netdev->ll_protocol->ll_addr_len );
444 macpath->IfType = ntohs ( netdev->ll_protocol->ll_proto );
445 if ( ( tag = vlan_tag ( netdev ) ) ) {
446 vlanpath = ( ( ( void * ) macpath ) + sizeof ( *macpath ) );
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 );
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;
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;
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 );
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 );
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;
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 ) {
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 */
814EFI_DEVICE_PATH_PROTOCOL * efi_boot_path ( unsigned int number ) {
815 EFI_RUNTIME_SERVICES *rs = efi_systab->RuntimeServices;
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 */
888 EFI_RUNTIME_SERVICES *rs = efi_systab->RuntimeServices;
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 */
946static 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 */
967static 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/* Avoid dragging in IPv4, IPv6, and DNS support if not otherwise used */
998extern const struct setting ip_setting __attribute__ (( weak ));
999extern const struct setting netmask_setting __attribute__ (( weak ));
1000extern const struct setting gateway_setting __attribute__ (( weak ));
1001extern const struct setting ip6_setting __attribute__ (( weak ));
1002extern const struct setting len6_setting __attribute__ (( weak ));
1003extern const struct setting gateway6_setting __attribute__ (( weak ));
1004extern const struct setting dns_setting __attribute__ (( weak ));
1005extern const struct setting dns6_setting __attribute__ (( weak ));
1006
1007/** EFI device path settings */
1010 MSG_IPv4_DP, offsetof ( IPv4_DEVICE_PATH, LocalIpAddress ),
1011 sizeof ( struct in_addr ) },
1013 MSG_IPv4_DP, offsetof ( IPv4_DEVICE_PATH, SubnetMask ),
1014 sizeof ( struct in_addr ) },
1016 MSG_IPv4_DP, offsetof ( IPv4_DEVICE_PATH, GatewayIpAddress ),
1017 sizeof ( struct in_addr ) },
1019 MSG_IPv6_DP, offsetof ( IPv6_DEVICE_PATH, LocalIpAddress ),
1020 sizeof ( struct in6_addr ) },
1022 MSG_IPv6_DP, offsetof ( IPv6_DEVICE_PATH, PrefixLength ),
1023 sizeof ( uint8_t ) },
1025 MSG_IPv6_DP, offsetof ( IPv6_DEVICE_PATH, GatewayIpAddress ),
1026 sizeof ( struct in6_addr ) },
1028 MSG_DNS_DP, offsetof ( DNS_DEVICE_PATH, DnsServerIp ),
1029 sizeof ( struct in_addr ) },
1031 MSG_DNS_DP, offsetof ( DNS_DEVICE_PATH, DnsServerIp ),
1032 sizeof ( struct in6_addr ) },
1033};
1034
1035/**
1036 * Fetch value of EFI device path setting
1037 *
1038 * @v settings Settings block
1039 * @v setting Setting to fetch
1040 * @v data Buffer to fill with setting data
1041 * @v len Length of buffer
1042 * @ret len Length of setting data, or negative error
1043 */
1044static int efi_path_fetch ( struct settings *settings, struct setting *setting,
1045 void *data, size_t len ) {
1046 struct efi_path_settings *pathsets =
1048 EFI_DEVICE_PATH_PROTOCOL *path = pathsets->path;
1050 struct efi_path_setting *pathset;
1051 unsigned int i;
1052 int ret;
1053
1054 /* Find matching path setting, if any */
1055 for ( i = 0 ; i < ( sizeof ( efi_path_settings ) /
1056 sizeof ( efi_path_settings[0] ) ) ; i++ ) {
1057
1058 /* Check for a matching setting */
1059 pathset = &efi_path_settings[i];
1060 if ( ! pathset->setting )
1061 continue;
1062 if ( setting_cmp ( setting, pathset->setting ) != 0 )
1063 continue;
1064
1065 /* Find matching device path element, if any */
1066 for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
1067
1068 /* Check for a matching path type */
1069 if ( ( path->Type != pathset->type ) ||
1070 ( path->SubType != pathset->subtype ) )
1071 continue;
1072
1073 /* Fetch value */
1074 if ( ( ret = pathset->fetch ( pathset, path,
1075 data, len ) ) < 0 )
1076 return ret;
1077
1078 /* Apply default type, if not already set */
1079 if ( ! setting->type )
1080 setting->type = pathset->setting->type;
1081
1082 return ret;
1083 }
1084 break;
1085 }
1086
1087 return -ENOENT;
1088}
1089
1090/** EFI device path settings operations */
1094
1095/**
1096 * Create per-netdevice EFI path settings
1097 *
1098 * @v netdev Network device
1099 * @v priv Private data
1100 * @ret rc Return status code
1101 */
1102static int efi_path_net_probe ( struct net_device *netdev, void *priv ) {
1103 struct efi_path_settings *pathsets = priv;
1104 struct settings *settings = &pathsets->settings;
1106 unsigned int vlan;
1107 void *mac;
1108 int rc;
1109
1110 /* Check applicability */
1111 pathsets->path = path;
1112 mac = efi_path_mac ( path );
1113 vlan = efi_path_vlan ( path );
1114 if ( ( mac == NULL ) ||
1115 ( memcmp ( mac, netdev->ll_addr,
1116 netdev->ll_protocol->ll_addr_len ) != 0 ) ||
1117 ( vlan != vlan_tag ( netdev ) ) ) {
1118 DBGC ( settings, "EFI path %s does not apply to %s\n",
1119 efi_devpath_text ( path ), netdev->name );
1120 return 0;
1121 }
1122
1123 /* Never override a real DHCP settings block */
1125 DHCP_SETTINGS_NAME ) ) {
1126 DBGC ( settings, "EFI path %s not overriding %s DHCP "
1127 "settings\n", efi_devpath_text ( path ), netdev->name );
1128 return 0;
1129 }
1130
1131 /* Initialise and register settings */
1133 &netdev->refcnt, NULL );
1135 DHCP_SETTINGS_NAME ) ) != 0 ) {
1136 DBGC ( settings, "EFI path %s could not register for %s: %s\n",
1137 efi_devpath_text ( path ), netdev->name,
1138 strerror ( rc ) );
1139 return rc;
1140 }
1141 DBGC ( settings, "EFI path %s registered for %s\n",
1142 efi_devpath_text ( path ), netdev->name );
1143
1144 return 0;
1145}
1146
1147/** EFI path settings per-netdevice driver */
1148struct net_driver efi_path_net_driver __net_driver = {
1149 .name = "EFI path",
1150 .priv_len = sizeof ( struct efi_path_settings ),
1151 .probe = efi_path_net_probe,
1152};
unsigned short UINT16
2-byte unsigned value.
char CHAR8
1-byte Character
UINT64 UINTN
Unsigned value of native width.
unsigned short CHAR16
2-byte Character.
unsigned int UINT32
4-byte unsigned value.
PACKED union @165104130223077263224044232125337106163015377141::@273126103036270271166311122320164340317073026312 Header
Definition Acpi10.h:156
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define BBS_BBS_DP
BIOS Boot Specification Device Path SubType.
#define ISCSI_LOGIN_OPTION_AUTHMETHOD_NON
Definition DevicePath.h:960
#define INFINIBAND_RESOURCE_FLAG_STORAGE_PROTOCOL
Definition DevicePath.h:689
#define MSG_IPv6_DP
IPv6 Device Path SubType.
Definition DevicePath.h:610
#define MSG_IPv4_DP
IPv4 Device Path SubType.
Definition DevicePath.h:569
#define MSG_INFINIBAND_DP
InfiniBand Device Path SubType.
Definition DevicePath.h:654
#define MEDIA_DEVICE_PATH
#define END_ENTIRE_DEVICE_PATH_SUBTYPE
#define MSG_URI_DP
Uniform Resource Identifiers (URI) Device Path SubType.
Definition DevicePath.h:882
#define BBS_TYPE_UNKNOWN
#define BBS_DEVICE_PATH
BIOS Boot Specification Device Path.
#define SIGNATURE_TYPE_GUID
#define MEDIA_HARDDRIVE_DP
Hard Drive Media Device Path SubType.
#define MSG_DNS_DP
DNS Device Path SubType.
Definition DevicePath.h:866
#define MSG_USB_DP
USB Device Path SubType.
Definition DevicePath.h:421
#define MSG_ISCSI_DP
iSCSI Device Path SubType
Definition DevicePath.h:928
#define MSG_MAC_ADDR_DP
MAC Address Device Path SubType.
Definition DevicePath.h:553
#define END_DEVICE_PATH_TYPE
#define MSG_FIBRECHANNELEX_DP
Fibre Channel Ex SubType.
Definition DevicePath.h:385
#define MSG_SATA_DP
SATA Device Path SubType.
Definition DevicePath.h:513
#define MSG_VLAN_DP
VLAN Device Path SubType.
Definition DevicePath.h:967
#define MESSAGING_DEVICE_PATH
Messaging Device Paths.
Definition DevicePath.h:324
EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH
Device Path protocol definition for backward-compatible with EFI1.1.
Definition DevicePath.h:66
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
GUID EFI_GUID
128-bit buffer containing a unique identifier value.
#define EFI_BUFFER_TOO_SMALL
Enumeration of EFI_STATUS.
struct _EFI_LOAD_OPTION EFI_LOAD_OPTION
typeof(acpi_finder=acpi_find)
ACPI table finder.
Definition acpi.c:48
AoE protocol.
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
unsigned char uint8_t
Definition stdint.h:10
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" retur dest)
Definition string.h:151
static const void * src
Definition string.h:48
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
const char * name
Definition ath9k_hw.c:1986
#define max(x, y)
Definition ath.h:41
uint32_t next
Next descriptor address.
Definition dwmac.h:11
ring len
Length.
Definition dwmac.h:226
uint64_t tag
Identity tag.
Definition edd.h:1
uint64_t guid
GUID.
Definition edd.h:1
const char * efi_devpath_text(EFI_DEVICE_PATH_PROTOCOL *path)
Get textual representation of device path.
Definition efi_debug.c:247
struct efi_device * efidev_parent(struct device *dev)
Get parent EFI device.
Definition efi_driver.c:129
EFI driver interface.
EFI_GUID efi_global_variable
Global variable GUID.
Definition efi_guid.c:469
EFI_DEVICE_PATH_PROTOCOL * efi_loaded_image_path
Device path for the loaded image's device handle.
Definition efi_init.c:42
unsigned int efi_path_vlan(EFI_DEVICE_PATH_PROTOCOL *path)
Get VLAN tag from device path.
Definition efi_path.c:237
const struct setting gateway6_setting
const struct setting ip_setting
const struct setting len6_setting
const struct setting ip6_setting
EFI_DEVICE_PATH_PROTOCOL * efi_current_boot_path(void)
Get EFI device path for current boot option.
Definition efi_path.c:887
size_t efi_path_len(EFI_DEVICE_PATH_PROTOCOL *path)
Find length of device path (excluding terminator)
Definition efi_path.c:174
EFI_DEVICE_PATH_PROTOCOL * efi_paths(EFI_DEVICE_PATH_PROTOCOL *first,...)
Concatenate EFI device paths.
Definition efi_path.c:344
EFI_DEVICE_PATH_PROTOCOL * efi_usb_path(struct usb_function *func)
Construct EFI device path for USB function.
Definition efi_path.c:697
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:1044
EFI_DEVICE_PATH_PROTOCOL * efi_describe(struct interface *intf)
Describe object as an EFI device path.
Definition efi_path.c:920
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
const struct setting dns_setting
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
static struct @253306250275077066365073162134023254344344126325 efi_dummy_parent_path
Dummy parent device path.
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
EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path(struct net_device *netdev)
Construct EFI device path for network device.
Definition efi_path.c:411
BBS_BBS_DEVICE_PATH bbs
Definition efi_path.c:57
CHAR8 tring[4]
Definition efi_path.c:58
const struct setting dns6_setting
static struct settings_operations efi_path_settings_operations
EFI device path settings operations.
Definition efi_path.c:1091
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_DEVICE_PATH_PROTOCOL * efi_iscsi_path(struct iscsi_session *iscsi)
Construct EFI device path for iSCSI device.
Definition efi_path.c:506
const struct setting netmask_setting
EFI_DEVICE_PATH_PROTOCOL * efi_aoe_path(struct aoe_device *aoedev)
Construct EFI device path for AoE device.
Definition efi_path.c:572
EFI_DEVICE_PATH_PROTOCOL * efi_path_next(EFI_DEVICE_PATH_PROTOCOL *path)
Find next element in device path.
Definition efi_path.c:119
EFI_DEVICE_PATH_PROTOCOL * efi_uri_path(struct uri *uri)
Construct EFI device path for URI.
Definition efi_path.c:469
static EFI_DEVICE_PATH_PROTOCOL * efi_parent_path(struct device *dev)
Construct EFI parent device path.
Definition efi_path.c:390
struct uri * efi_path_uri(EFI_DEVICE_PATH_PROTOCOL *path)
Parse URI from device path.
Definition efi_path.c:301
int efi_path_check(EFI_DEVICE_PATH_PROTOCOL *path, size_t max)
Check that device path is well-formed.
Definition efi_path.c:187
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 * efi_boot_path(unsigned int number)
Get EFI device path for numbered boot option.
Definition efi_path.c:814
static int efi_path_net_probe(struct net_device *netdev, void *priv)
Create per-netdevice EFI path settings.
Definition efi_path.c:1102
void * efi_path_mac(EFI_DEVICE_PATH_PROTOCOL *path)
Get MAC address from device path.
Definition efi_path.c:213
const struct setting gateway_setting
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
EFI_DEVICE_PATH_PROTOCOL * efi_path_end(EFI_DEVICE_PATH_PROTOCOL *path)
Find end of device path.
Definition efi_path.c:163
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 paths.
static void efi_path_terminate(EFI_DEVICE_PATH_PROTOCOL *end)
Terminate device path.
Definition efi_path.h:31
#define efi_describe_TYPE(object_type)
Definition efi_path.h:69
int efi_snprintf(wchar_t *wbuf, size_t wsize, const char *fmt,...)
Write a formatted string to a buffer.
EFI strings.
uint8_t id
Request identifier.
Definition ena.h:1
uint8_t data[48]
Additional event data.
Definition ena.h:11
struct ena_llq_option desc
Descriptor counts.
Definition ena.h:9
uint8_t mac[ETH_ALEN]
MAC address.
Definition ena.h:13
Error codes.
Fibre Channel Protocol.
static struct net_device * netdev
Definition gdbudp.c:53
#define DBGC2(...)
Definition compiler.h:522
#define DBGC2_HDA(...)
Definition compiler.h:523
#define DBGC(...)
Definition compiler.h:505
#define DBGC_HDA(...)
Definition compiler.h:506
uint16_t size
Buffer size.
Definition dwmac.h:3
static unsigned int count
Number of entries.
Definition dwmac.h:220
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define ENOENT
No such file or directory.
Definition errno.h:515
#define EINVAL
Invalid argument.
Definition errno.h:429
#define ENOMEM
Not enough space.
Definition errno.h:535
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
SCSI RDMA Protocol over Infiniband.
u16 fc
802.11 Frame Control field
Definition ieee80211.h:0
#define ntohs(value)
Definition byteswap.h:137
#define __attribute__(x)
Definition compiler.h:10
Dynamic Host Configuration Protocol.
#define DHCP_SETTINGS_NAME
Settings block name used for DHCP responses.
Definition dhcp.h:711
EFI API.
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition efi.h:175
EFI_SYSTEM_TABLE * efi_systab
Configuration settings.
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
Transport-network layer interface.
Universal Serial Bus (USB)
static unsigned int usb_depth(struct usb_device *usb)
Get USB depth.
Definition usb.h:1269
String functions.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
void * intf_object(struct interface *intf)
Get pointer to object containing object interface.
Definition interface.c:160
void intf_put(struct interface *intf)
Decrement reference count on an object interface.
Definition interface.c:150
#define intf_get_dest_op(intf, type, dest)
Get object interface destination and operation method.
Definition interface.h:270
iSCSI protocol
unsigned long tmp
Definition linux_pci.h:65
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
void * malloc(size_t size)
Allocate memory.
Definition malloc.c:621
Network device management.
#define __net_driver
Declare a network driver.
Definition netdevice.h:507
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition netdevice.h:587
uint32_t end
Ending offset.
Definition netvsc.h:7
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
uint32_t first
First block in range.
Definition pccrr.h:1
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition settings.c:476
int setting_cmp(const struct setting *a, const struct setting *b)
Compare two settings.
Definition settings.c:1121
struct settings * find_child_settings(struct settings *parent, const char *name)
Find child settings block.
Definition settings.c:280
#define va_arg(ap, type)
Definition stdarg.h:9
#define va_end(ap)
Definition stdarg.h:10
#define va_start(ap, last)
Definition stdarg.h:8
__builtin_va_list va_list
Definition stdarg.h:7
#define offsetof(type, field)
Get offset of a field within a structure.
Definition stddef.h:25
#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
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition string.c:115
size_t strlen(const char *src)
Get length of string.
Definition string.c:244
This Device Path is used to describe the booting of non-EFI-aware operating systems.
UINT8 IsIPv6
Indicates the DNS server address is IPv4 or IPv6 address.
Definition DevicePath.h:872
EFI_IP_ADDRESS DnsServerIp[]
Instance of the DNS server address.
Definition DevicePath.h:876
This protocol can be used on any device handle to obtain generic path/location information concerning...
Definition DevicePath.h:46
UINT8 Type
0x01 Hardware Device Path.
Definition DevicePath.h:47
UINT8 Length[2]
Specific Device Path data.
Definition DevicePath.h:59
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
EFI Runtime Services Table.
Definition UefiSpec.h:1880
EFI_GET_VARIABLE GetVariable
Definition UefiSpec.h:1903
The Hard Drive Media Device Path is used to represent a partition on a hard drive.
UINT8 Signature[16]
Signature unique to this partition: If SignatureType is 0, this field has to be initialized with 16 z...
UINT8 SignatureType
Type of Disk Signature: (Unused values reserved).
UINT64 TargetPortId
64-bit persistent ID of remote IOC port.
Definition DevicePath.h:679
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:656
UINT32 ResourceFlags
Flags to help identify/manage InfiniBand device path elements: Bit 0 - IOC/Service (0b = IOC,...
Definition DevicePath.h:666
UINT64 DeviceId
64-bit persistent ID of remote device.
Definition DevicePath.h:683
UINT8 PortGid[16]
128-bit Global Identifier for remote fabric port.
Definition DevicePath.h:670
UINT64 ServiceId
64-bit unique identifier to remote IOC or server process.
Definition DevicePath.h:675
UINT64 Lun
iSCSI Logical Unit Number.
Definition DevicePath.h:942
UINT16 LoginOption
iSCSI Login Options.
Definition DevicePath.h:938
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:930
EFI_MAC_ADDRESS MacAddress
The MAC address for a network interface padded with 0s.
Definition DevicePath.h:559
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:555
UINT8 IfType
Network interface type(i.e.
Definition DevicePath.h:563
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:884
CHAR8 Uri[]
Instance of the URI pursuant to RFC 3986.
Definition DevicePath.h:888
UINT8 InterfaceNumber
USB Interface Number.
Definition DevicePath.h:431
UINT8 ParentPortNumber
USB Parent Port Number.
Definition DevicePath.h:427
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:423
UINT16 VlanId
VLAN identifier (0-4094).
Definition DevicePath.h:973
EFI_DEVICE_PATH_PROTOCOL Header
Definition DevicePath.h:969
UINT16 FilePathListLength
Length in bytes of the FilePathList.
Definition UefiSpec.h:2149
An AoE device.
Definition aoe.h:116
uint8_t minor
Minor number.
Definition aoe.h:128
struct net_device * netdev
Network device.
Definition aoe.h:121
uint16_t major
Major number.
Definition aoe.h:126
A hardware device.
Definition device.h:77
An EFI device.
Definition efi_driver.h:18
struct device dev
Generic device.
Definition efi_driver.h:20
EFI_DEVICE_PATH_PROTOCOL * path
EFI device path copy.
Definition efi_driver.h:26
An EFI device path setting.
Definition efi_path.c:88
uint8_t subtype
Path subtype.
Definition efi_path.c:106
uint8_t type
Path type.
Definition efi_path.c:104
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_t offset
Offset within device path.
Definition efi_path.c:108
uint8_t len
Length (if fixed)
Definition efi_path.c:110
const struct setting * setting
Setting.
Definition efi_path.c:90
An EFI device path settings block.
Definition efi_path.c:80
EFI_DEVICE_PATH_PROTOCOL * path
Device path.
Definition efi_path.c:84
struct settings settings
Settings interface.
Definition efi_path.c:82
An FCP device description.
Definition fcp.h:168
struct device * dev
Underlying device.
Definition infiniband.h:411
An Infiniband SRP device.
Definition ib_srp.h:76
struct ib_device * ibdev
Infiniband device.
Definition ib_srp.h:86
struct ipxe_ib_sbft sbft
Boot firmware table parameters.
Definition ib_srp.h:91
IP6 address structure.
Definition in.h:51
IP address structure.
Definition in.h:42
An object interface.
Definition interface.h:125
struct interface * intf
Original interface.
Definition interface.h:159
An Infiniband SRP sBFT created by iPXE.
Definition ib_srp.h:64
struct sbft_srp_subtable srp
The SRP subtable.
Definition ib_srp.h:70
struct sbft_ib_subtable ib
The Infiniband subtable.
Definition ib_srp.h:72
An iSCSI session.
Definition iscsi.h:545
char * target_iqn
Target IQN.
Definition iscsi.h:563
struct scsi_lun lun
SCSI LUN (for boot firmware table)
Definition iscsi.h:664
struct sockaddr target_sockaddr
Target socket address (for boot firmware table)
Definition iscsi.h:662
A network device.
Definition netdevice.h:353
A network upper-layer driver.
Definition netdevice.h:477
union ib_guid service_id
Service ID.
Definition ib_srp.h:54
union ib_gid dgid
Destination GID.
Definition ib_srp.h:52
union srp_port_id target
Target port identifier.
Definition srp.h:820
A setting.
Definition settings.h:24
const struct setting_type * type
Setting type.
Definition settings.h:37
Settings block operations.
Definition settings.h:86
A settings block.
Definition settings.h:133
TCP/IP socket address.
Definition tcpip.h:76
A Uniform Resource Identifier.
Definition uri.h:65
const char * path
Path (after URI decoding)
Definition uri.h:81
A USB device.
Definition usb.h:723
struct usb_port * port
USB port.
Definition usb.h:727
unsigned int count
Number of interfaces.
Definition usb.h:665
A USB function.
Definition usb.h:674
struct usb_device * usb
USB device.
Definition usb.h:678
struct usb_function_descriptor desc
Function descriptor.
Definition usb.h:680
struct device dev
Generic device.
Definition usb.h:682
uint8_t interface[0]
List of interface numbers.
Definition usb.h:697
struct usb_device * usb
Underlying USB device, if any.
Definition usb.h:847
struct usb_hub * hub
USB hub.
Definition usb.h:815
unsigned int address
Port address.
Definition usb.h:817
struct net_device * tcpip_netdev(struct sockaddr_tcpip *st_dest)
Determine transmitting network device.
Definition tcpip.c:115
static struct tlan_private * priv
Definition tlan.c:225
SRP target port identifier for Infiniband.
Definition ib_srp.h:33
union srp_port_id srp
SRP version of port identifier.
Definition ib_srp.h:35
A universally unique ID.
Definition uuid.h:16
size_t format_uri(const struct uri *uri, char *buf, size_t len)
Format URI.
Definition uri.c:473
struct uri * parse_uri(const char *uri_string)
Parse URI.
Definition uri.c:297
Uniform Resource Identifiers.
Universally unique IDs.
static void uuid_mangle(union uuid *uuid)
Change UUID endianness.
Definition uuid.h:44
Virtual LANs.
static unsigned int vlan_tag(struct net_device *netdev)
Get the VLAN tag.
Definition vlan.h:74
size_t wcsnlen(const wchar_t *string, size_t max)
Calculate length of wide-character string.
Definition wchar.c:43