1# Overview of pldmtool 2 3pldmtool is a client tool that acts as a PLDM requester which runs on the BMC. 4pldmtool sends the request message and displays the response message also 5provides flexibility to parse the response message and display it in readable 6format. 7 8pldmtool supports the subcommands for PLDM types such as base, platform, bios, 9fru, and oem-ibm. 10 11- Source files are implemented in C++. 12- Consumes pldm/libpldm encode and decode functions. 13- Communicates with pldmd daemon running on BMC. 14- Enables writing functional test cases for PLDM stack. 15 16please refer the [DMTF PLDM specifications](https://www.dmtf.org/) with respect 17to the pldm types. 18 19## Code organization 20 21Source files in pldmtool repository are named with respect to the PLDM type. 22 23Example: 24 25```txt 26pldm_base_cmd.[hpp/cpp], pldm_fru_cmd.[hpp/cpp] 27``` 28 29pldmtool commands for corresponding PLDM type is constructed with the help of 30encode request and decode response APIs which are implemented in pldm/libpldm. 31 32Example: 33 34Given a PLDM command "foo" of PLDM type "base" the pldmtool should consume 35following API from the libpldm. 36 37```c 38- encode_foo_req() - Send the required input parameters in the request message. 39- decode_foo_resp() - Decode the response message. 40``` 41 42If PLDM commands are not yet supported in the pldmtool repository user can 43directly send the request message with the help of **pldmtool raw -d \<data\>** 44option. 45 46## Usage 47 48User can see the pldmtool supported PLDM types in the usage output available 49with the **-h** help option as shown below: 50 51```bash 52$ pldmtool -h 53PLDM requester tool for OpenBMC 54Usage: pldmtool [OPTIONS] SUBCOMMAND 55 56Options: 57 -h,--help Print this help message and exit 58 59Subcommands: 60 raw send a raw request and print response 61 base base type command 62 bios bios type command 63 platform platform type command 64 fru FRU type command 65 oem-ibm oem type command 66 67``` 68 69pldmtool command prompt expects a PLDM type to display the list of supported 70commands that are already implemented for that particular PLDM type. 71 72```bash 73# command format 74pldmtool <pldmType> -h 75``` 76 77Example: 78 79```bash 80$ pldmtool base -h 81 82base type command 83Usage: pldmtool base [OPTIONS] SUBCOMMAND 84 85Options: 86 -h,--help Print this help message and exit 87 88Subcommands: 89 GetPLDMTypes get pldm supported types 90 GetPLDMVersion get version of a certain type 91 GetTID get Terminus ID (TID) 92 GetPLDMCommands get supported commands of pldm type 93 94``` 95 96More help on the command usage can be found by specifying the PLDM type and the 97command name with **-h** argument as shown below. 98 99```bash 100# command format 101pldmtool <pldmType> <commandName> -h 102``` 103 104Example: 105 106```bash 107$ pldmtool base GetPLDMTypes -h 108 109get pldm supported types 110Usage: pldmtool base GetPLDMTypes [OPTIONS] 111 112Options: 113 -h,--help Print this help message and exit 114 -m,--mctp_eid UINT MCTP endpoint ID 115 -v,--verbose 116``` 117 118## pldmtool raw command usage 119 120pldmtool raw command option accepts request message in the hexadecimal bytes and 121send the response message in hexadecimal bytes. 122 123```bash 124$ pldmtool raw -h 125send a raw request and print response 126Usage: pldmtool raw [OPTIONS] 127 128Options: 129 -h,--help Print this help message and exit 130 -m,--mctp_eid UINT MCTP endpoint ID 131 -v,--verbose 132 -d,--data UINT REQUIRED raw data 133``` 134 135**pldmtool request message format:** 136 137```bash 138pldmtool raw --data 0x80 <pldmType> <cmdType> <payloadReq> 139 140payloadReq - stream of bytes constructed based on the request message format 141 defined for the command type as per the spec. 142``` 143 144**pldmtool response message format:** 145 146```txt 147<instanceId> <hdrVersion> <pldmType> <cmdType> <completionCode> <payloadResp> 148 149payloadResp - stream of bytes displayed based on the response message format 150 defined for the command type as per the spec. 151``` 152 153Example: 154 155```bash 156$ pldmtool raw -d 0x80 0x00 0x04 0x00 0x00 157 158Request Message: 15908 01 80 00 04 00 00 160Response Message: 16108 01 00 00 04 00 1d 00 00 00 00 00 00 80 162 163``` 164 165## pldmtool output format 166 167In the current pldmtool implementation response message from pldmtool is parsed 168and displayed in the JSON format. 169 170Example: 171 172```bash 173$ pldmtool base GetPLDMTypes 174[ 175 { 176 "PLDM Type": "base", 177 "PLDM Type Code": 0 178 }, 179 { 180 "PLDM Type": "platform", 181 "PLDM Type Code": 2 182 }, 183 { 184 "PLDM Type": "bios", 185 "PLDM Type Code": 3 186 }, 187 { 188 "PLDM Type": "fru", 189 "PLDM Type Code": 4 190 }, 191 { 192 "PLDM Type": "oem-ibm", 193 "PLDM Type Code": 63 194 } 195] 196``` 197 198## Understanding pldmtool output error scenario 199 200When the pldmtool receives the wrong response for the request sent it errors out 201with a response code and completion code. The completion code represents the 202type of error and is defined in every pldm type `pldm_\<type\>_completion_codes` 203enum values. 204 205Example: 206 207This is a platform command and the completion code can be understood from 208[`libpldm/platform.h`](https://github.com/openbmc/libpldm/blob/a98814fc37a5d59207163cb2fa81f4162eaf69cd/include/libpldm/platform.h#L204) 209file. 210 211```bash 212$ pldmtool platform getpdr -d 17 213Response Message Error: rc=0 , cc=130 214``` 215 216## pldmtool with mctp_eid option 217 218Use **-m** or **--mctp_eid** option to send pldm request message to remote mctp 219end point and by default pldmtool consider mctp_eid value as **'08'**. 220 221```bash 222# Command format: 223pldmtool <pldmType> <cmdType> -m <mctpId> 224 225# pldmtool raw command format 226pldmtool raw -d 0x80 <pldmType> <cmdType> <payloadReq> -m <mctpId> 227``` 228 229Example: 230 231```bash 232# Get PLDM Types 233pldmtool base GetPLDMTypes -m 8 234 235# pldmtool raw command 236pldmtool raw -d 0x80 0x00 0x04 0x00 0x00 -m 0x08 237 238``` 239 240## pldmtool verbosity 241 242By default verbose flag is disabled on the pldmtool. 243 244Enable verbosity with **-v** flag as shown below. 245 246Example: 247 248```bash 249pldmtool base GetPLDMTypes -v 250``` 251