github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/uefivars/boot/efiDppMessage.go (about)

     1  // Copyright 2020 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  //
     5  // SPDX-License-Identifier: BSD-3-Clause
     6  //
     7  
     8  package boot
     9  
    10  import (
    11  	"encoding/binary"
    12  	"fmt"
    13  )
    14  
    15  type EfiDppMsgSubType EfiDevPathProtoSubType
    16  
    17  const (
    18  	DppMsgTypeATAPI      EfiDppMsgSubType = iota + 1
    19  	DppMsgTypeSCSI                        //2
    20  	DppMsgTypeFibreCh                     //3
    21  	DppMsgTypeFirewire                    //4
    22  	DppMsgTypeUSB                         //5
    23  	DppMsgTypeIIO                         //6
    24  	_                                     //7
    25  	_                                     //8
    26  	DppMsgTypeInfiniband                  //9
    27  	DppMsgTypeVendor                      //10 //uart flow control, sas are subtypes
    28  	DppMsgTypeMAC                         //11
    29  	DppMsgTypeIP4                         //12
    30  	DppMsgTypeIP6                         //13
    31  	DppMsgTypeUART                        //14
    32  	DppMsgTypeUSBClass                    //15
    33  	DppMsgTypeUSBWWID                     //16
    34  	DppMsgTypeDevLU                       //17
    35  	DppMsgTypeSATA                        //18
    36  	DppMsgTypeISCSI                       //19
    37  	DppMsgTypeVLAN                        //20
    38  	_                                     //21
    39  	DppMsgTypeSASEx                       //22
    40  	DppMsgTypeNVME                        //23
    41  	DppMsgTypeURI                         //24
    42  	DppMsgTypeUFS                         //25
    43  	DppMsgTypeSD                          //26
    44  	DppMsgTypeBT                          //27
    45  	DppMsgTypeWiFi                        //28
    46  	DppMsgTypeeMMC                        //29
    47  	DppMsgTypeBLE                         //30
    48  	DppMsgTypeDNS                         //31
    49  	DppMsgTypeNVDIMM                      //32
    50  	DppMsgTypeRest                        //documented as 32, likely 33
    51  )
    52  
    53  var efiDppMsgSubTypeStrings = map[EfiDppMsgSubType]string{
    54  	DppMsgTypeATAPI:      "ATAPI",
    55  	DppMsgTypeSCSI:       "SCSI",
    56  	DppMsgTypeFibreCh:    "Fibre Channel",
    57  	DppMsgTypeFirewire:   "1394",
    58  	DppMsgTypeUSB:        "USB",
    59  	DppMsgTypeIIO:        "I2O",
    60  	DppMsgTypeInfiniband: "Infiniband",
    61  	DppMsgTypeVendor:     "Vendor",
    62  	DppMsgTypeMAC:        "MAC",
    63  	DppMsgTypeIP4:        "IPv4",
    64  	DppMsgTypeIP6:        "IPv6",
    65  	DppMsgTypeUART:       "UART",
    66  	DppMsgTypeUSBClass:   "USB Class",
    67  	DppMsgTypeUSBWWID:    "USB WWID",
    68  	DppMsgTypeDevLU:      "Device Logical Unit",
    69  	DppMsgTypeSATA:       "SATA",
    70  	DppMsgTypeISCSI:      "iSCSI",
    71  	DppMsgTypeVLAN:       "VLAN",
    72  	DppMsgTypeSASEx:      "SAS Ex",
    73  	DppMsgTypeNVME:       "NVME",
    74  	DppMsgTypeURI:        "URI",
    75  	DppMsgTypeUFS:        "UFS",
    76  	DppMsgTypeSD:         "SD",
    77  	DppMsgTypeBT:         "Bluetooth",
    78  	DppMsgTypeWiFi:       "WiFi",
    79  	DppMsgTypeeMMC:       "eMMC",
    80  	DppMsgTypeBLE:        "BLE",
    81  	DppMsgTypeDNS:        "DNS",
    82  	DppMsgTypeNVDIMM:     "NVDIMM",
    83  	DppMsgTypeRest:       "REST",
    84  }
    85  
    86  func (e EfiDppMsgSubType) String() string {
    87  	if s, ok := efiDppMsgSubTypeStrings[e]; ok {
    88  		return s
    89  	}
    90  	return fmt.Sprintf("UNKNOWN-0x%x", uint8(e))
    91  }
    92  
    93  // DppMsgATAPI is a struct describing an atapi dpp message.
    94  // pg 293
    95  type DppMsgATAPI struct {
    96  	Hdr             EfiDevicePathProtocolHdr
    97  	Primary, Master bool
    98  	LUN             uint16
    99  }
   100  
   101  var _ EfiDevicePathProtocol = (*DppMsgATAPI)(nil)
   102  
   103  // ParseDppMsgATAPI parses input into a DppMsgATAPI.
   104  func ParseDppMsgATAPI(h EfiDevicePathProtocolHdr, b []byte) (*DppMsgATAPI, error) {
   105  	if h.Length != 8 {
   106  		return nil, ErrParse
   107  	}
   108  	msg := &DppMsgATAPI{
   109  		Hdr:     h,
   110  		Primary: b[0] == 0,
   111  		Master:  b[1] == 0,
   112  		LUN:     binary.LittleEndian.Uint16(b[2:4]),
   113  	}
   114  	return msg, nil
   115  }
   116  
   117  func (e *DppMsgATAPI) Header() EfiDevicePathProtocolHdr { return e.Hdr }
   118  
   119  // ProtoSubTypeStr returns the subtype as human readable.
   120  func (e *DppMsgATAPI) ProtoSubTypeStr() string {
   121  	return EfiDppMsgSubType(e.Hdr.ProtoSubType).String()
   122  }
   123  
   124  func (e *DppMsgATAPI) String() string {
   125  	return fmt.Sprintf("ATAPI(pri=%t,master=%t,lun=%d)", e.Primary, e.Master, e.LUN)
   126  }
   127  
   128  // Resolver returns a nil EfiPathSegmentResolver and ErrUnimpl. See the comment
   129  // associated with ErrUnimpl.
   130  func (e *DppMsgATAPI) Resolver() (EfiPathSegmentResolver, error) {
   131  	return nil, ErrUnimpl
   132  }
   133  
   134  // DppMsgMAC contains a MAC address.
   135  // pg 300
   136  type DppMsgMAC struct {
   137  	Hdr    EfiDevicePathProtocolHdr
   138  	Mac    [32]byte //0-padded
   139  	IfType uint8    //RFC3232; seems ethernet is 6
   140  }
   141  
   142  // ParseDppMsgMAC parses input into a DppMsgMAC.
   143  func ParseDppMsgMAC(h EfiDevicePathProtocolHdr, b []byte) (*DppMsgMAC, error) {
   144  	if h.Length != 37 {
   145  		return nil, ErrParse
   146  	}
   147  	mac := &DppMsgMAC{
   148  		Hdr: h,
   149  		//Mac:    b[:32],
   150  		IfType: b[32],
   151  	}
   152  	copy(mac.Mac[:], b[:32])
   153  	return mac, nil
   154  }
   155  
   156  func (e *DppMsgMAC) Header() EfiDevicePathProtocolHdr { return e.Hdr }
   157  
   158  // ProtoSubTypeStr returns the subtype as human readable.
   159  func (e *DppMsgMAC) ProtoSubTypeStr() string {
   160  	return EfiDppMsgSubType(e.Hdr.ProtoSubType).String()
   161  }
   162  
   163  func (e *DppMsgMAC) String() string {
   164  	switch e.IfType {
   165  	case 1:
   166  		return fmt.Sprintf("MAC(%x)", e.Mac[:6])
   167  	default:
   168  		return fmt.Sprintf("MAC(mac=%08x,iftype=0x%x)", e.Mac, e.IfType)
   169  	}
   170  }
   171  
   172  // Resolver returns a nil EfiPathSegmentResolver and ErrUnimpl. See the comment
   173  // associated with ErrUnimpl.
   174  func (e *DppMsgMAC) Resolver() (EfiPathSegmentResolver, error) {
   175  	return nil, ErrUnimpl
   176  }