/** Build the options buffer for the DHCPv4 request packet. @param[in] Private Pointer to HTTP boot driver private data. @param[out] OptList Pointer to the option pointer array. @param[in] Buffer Pointer to the buffer to contain the option list. @return Index The count of the built-in options. **/ UINT32 HttpBootBuildDhcp4Options ( IN HTTP_BOOT_PRIVATE_DATA *Private, OUT EFI_DHCP4_PACKET_OPTION **OptList, IN UINT8 *Buffer ) { HTTP_BOOT_DHCP4_OPTION_ENTRY OptEnt; UINT16 Value; UINT32 Index; Index = 0; OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Buffer; // // Append parameter request list option. // OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_PARA_LIST; OptList[Index]->Length = 27; OptEnt.Para = (HTTP_BOOT_DHCP4_OPTION_PARA *) OptList[Index]->Data; OptEnt.Para->ParaList[0] = HTTP_BOOT_DHCP4_TAG_NETMASK; OptEnt.Para->ParaList[1] = HTTP_BOOT_DHCP4_TAG_TIME_OFFSET; OptEnt.Para->ParaList[2] = HTTP_BOOT_DHCP4_TAG_ROUTER; OptEnt.Para->ParaList[3] = HTTP_BOOT_DHCP4_TAG_TIME_SERVER; OptEnt.Para->ParaList[4] = HTTP_BOOT_DHCP4_TAG_NAME_SERVER; OptEnt.Para->ParaList[5] = HTTP_BOOT_DHCP4_TAG_DNS_SERVER; OptEnt.Para->ParaList[6] = HTTP_BOOT_DHCP4_TAG_HOSTNAME; OptEnt.Para->ParaList[7] = HTTP_BOOT_DHCP4_TAG_BOOTFILE_LEN; OptEnt.Para->ParaList[8] = HTTP_BOOT_DHCP4_TAG_DOMAINNAME; OptEnt.Para->ParaList[9] = HTTP_BOOT_DHCP4_TAG_ROOTPATH; OptEnt.Para->ParaList[10] = HTTP_BOOT_DHCP4_TAG_EXTEND_PATH; OptEnt.Para->ParaList[11] = HTTP_BOOT_DHCP4_TAG_EMTU; OptEnt.Para->ParaList[12] = HTTP_BOOT_DHCP4_TAG_TTL; OptEnt.Para->ParaList[13] = HTTP_BOOT_DHCP4_TAG_BROADCAST; OptEnt.Para->ParaList[14] = HTTP_BOOT_DHCP4_TAG_NIS_DOMAIN; OptEnt.Para->ParaList[15] = HTTP_BOOT_DHCP4_TAG_NIS_SERVER; OptEnt.Para->ParaList[16] = HTTP_BOOT_DHCP4_TAG_NTP_SERVER; OptEnt.Para->ParaList[17] = HTTP_BOOT_DHCP4_TAG_VENDOR; OptEnt.Para->ParaList[18] = HTTP_BOOT_DHCP4_TAG_REQUEST_IP; OptEnt.Para->ParaList[19] = HTTP_BOOT_DHCP4_TAG_LEASE; OptEnt.Para->ParaList[20] = HTTP_BOOT_DHCP4_TAG_SERVER_ID; OptEnt.Para->ParaList[21] = HTTP_BOOT_DHCP4_TAG_T1; OptEnt.Para->ParaList[22] = HTTP_BOOT_DHCP4_TAG_T2; OptEnt.Para->ParaList[23] = HTTP_BOOT_DHCP4_TAG_CLASS_ID; OptEnt.Para->ParaList[25] = HTTP_BOOT_DHCP4_TAG_BOOTFILE; OptEnt.Para->ParaList[26] = HTTP_BOOT_DHCP4_TAG_UUID; Index++; OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); // // Append UUID/Guid-based client identifier option // OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_UUID; OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_UUID); OptEnt.Uuid = (HTTP_BOOT_DHCP4_OPTION_UUID *) OptList[Index]->Data; OptEnt.Uuid->Type = 0; if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) { // // Zero the Guid to indicate NOT programable if failed to get system Guid. // ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID)); } Index++; OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); // // Append client network device interface option // OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_UNDI; OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_UNDI); OptEnt.Undi = (HTTP_BOOT_DHCP4_OPTION_UNDI *) OptList[Index]->Data; if (Private->Nii != NULL) { OptEnt.Undi->Type = Private->Nii->Type; OptEnt.Undi->MajorVer = Private->Nii->MajorVer; OptEnt.Undi->MinorVer = Private->Nii->MinorVer; } else { OptEnt.Undi->Type = DEFAULT_UNDI_TYPE; OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR; OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR; } Index++; OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); // // Append client system architecture option // OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_ARCH; OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_ARCH); OptEnt.Arch = (HTTP_BOOT_DHCP4_OPTION_ARCH *) OptList[Index]->Data; Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE); CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16)); Index++; OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]); // // Append vendor class identify option // OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_CLASS_ID; OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_CLID); OptEnt.Clid = (HTTP_BOOT_DHCP4_OPTION_CLID *) OptList[Index]->Data; CopyMem ( OptEnt.Clid, DEFAULT_CLASS_ID_DATA, sizeof (HTTP_BOOT_DHCP4_OPTION_CLID) ); HttpBootUintnToAscDecWithFormat ( EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.Clid->ArchitectureType, sizeof (OptEnt.Clid->ArchitectureType) ); if (Private->Nii != NULL) { CopyMem (OptEnt.Clid->InterfaceName, Private->Nii->StringId, sizeof (OptEnt.Clid->InterfaceName)); HttpBootUintnToAscDecWithFormat (Private->Nii->MajorVer, OptEnt.Clid->UndiMajor, sizeof (OptEnt.Clid->UndiMajor)); HttpBootUintnToAscDecWithFormat (Private->Nii->MinorVer, OptEnt.Clid->UndiMinor, sizeof (OptEnt.Clid->UndiMinor)); } Index++; return Index; }
/** Build the options buffer for the DHCPv6 request packet. @param[in] Private The pointer to HTTP BOOT driver private data. @param[out] OptList The pointer to the option pointer array. @param[in] Buffer The pointer to the buffer to contain the option list. @return Index The count of the built-in options. **/ UINT32 HttpBootBuildDhcp6Options ( IN HTTP_BOOT_PRIVATE_DATA *Private, OUT EFI_DHCP6_PACKET_OPTION **OptList, IN UINT8 *Buffer ) { HTTP_BOOT_DHCP6_OPTION_ENTRY OptEnt; UINT16 Value; UINT32 Index; Index = 0; OptList[0] = (EFI_DHCP6_PACKET_OPTION *) Buffer; // // Append client option request option // OptList[Index]->OpCode = HTONS (DHCP6_OPT_ORO); OptList[Index]->OpLen = HTONS (8); OptEnt.Oro = (HTTP_BOOT_DHCP6_OPTION_ORO *) OptList[Index]->Data; OptEnt.Oro->OpCode[0] = HTONS(DHCP6_OPT_BOOT_FILE_URL); OptEnt.Oro->OpCode[1] = HTONS(DHCP6_OPT_BOOT_FILE_PARAM); OptEnt.Oro->OpCode[2] = HTONS(DHCP6_OPT_DNS_SERVERS); OptEnt.Oro->OpCode[3] = HTONS(DHCP6_OPT_VENDOR_CLASS); Index++; OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]); // // Append client network device interface option // OptList[Index]->OpCode = HTONS (DHCP6_OPT_UNDI); OptList[Index]->OpLen = HTONS ((UINT16)3); OptEnt.Undi = (HTTP_BOOT_DHCP6_OPTION_UNDI *) OptList[Index]->Data; if (Private->Nii != NULL) { OptEnt.Undi->Type = Private->Nii->Type; OptEnt.Undi->MajorVer = Private->Nii->MajorVer; OptEnt.Undi->MinorVer = Private->Nii->MinorVer; } else { OptEnt.Undi->Type = DEFAULT_UNDI_TYPE; OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR; OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR; } Index++; OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]); // // Append client system architecture option // OptList[Index]->OpCode = HTONS (DHCP6_OPT_ARCH); OptList[Index]->OpLen = HTONS ((UINT16) sizeof (HTTP_BOOT_DHCP6_OPTION_ARCH)); OptEnt.Arch = (HTTP_BOOT_DHCP6_OPTION_ARCH *) OptList[Index]->Data; Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE); CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16)); Index++; OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]); // // Append vendor class identify option. // OptList[Index]->OpCode = HTONS (DHCP6_OPT_VENDOR_CLASS); OptList[Index]->OpLen = HTONS ((UINT16) sizeof (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS)); OptEnt.VendorClass = (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *) OptList[Index]->Data; OptEnt.VendorClass->Vendor = HTONL (HTTP_BOOT_DHCP6_ENTERPRISE_NUM); OptEnt.VendorClass->ClassLen = HTONS ((UINT16) sizeof (HTTP_BOOT_CLASS_ID)); CopyMem ( &OptEnt.VendorClass->ClassId, DEFAULT_CLASS_ID_DATA, sizeof (HTTP_BOOT_CLASS_ID) ); HttpBootUintnToAscDecWithFormat ( EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE, OptEnt.VendorClass->ClassId.ArchitectureType, sizeof (OptEnt.VendorClass->ClassId.ArchitectureType) ); if (Private->Nii != NULL) { CopyMem ( OptEnt.VendorClass->ClassId.InterfaceName, Private->Nii->StringId, sizeof (OptEnt.VendorClass->ClassId.InterfaceName) ); HttpBootUintnToAscDecWithFormat ( Private->Nii->MajorVer, OptEnt.VendorClass->ClassId.UndiMajor, sizeof (OptEnt.VendorClass->ClassId.UndiMajor) ); HttpBootUintnToAscDecWithFormat ( Private->Nii->MinorVer, OptEnt.VendorClass->ClassId.UndiMinor, sizeof (OptEnt.VendorClass->ClassId.UndiMinor) ); } Index++; return Index; }