/** Helper function called to calculate the prefix length associated with the string containing an Ipv4 or Ipv6 Internet Protocol address. @param[in] Ptr The pointer to the string containing an Ipv4 or Ipv6 Internet Protocol address. @param[out] Addr The pointer to the EFI_IP_ADDRESS_INFO structure to contain the result. @retval EFI_SUCCESS The operation completed successfully. @retval EFI_INVALID_PARAMETER Invalid parameter. @retval Others Other mistake case. **/ EFI_STATUS EfiInetAddrRange ( IN CHAR16 *Ptr, OUT EFI_IP_ADDRESS_INFO *Addr ) { EFI_STATUS Status; if ((Ptr == NULL) || (Addr == NULL)) { return EFI_INVALID_PARAMETER; } Status = NetLibStrToIp4 (Ptr, &Addr->Address.v4); if (!EFI_ERROR (Status)) { if ((UINT32)(*Addr->Address.v4.Addr) == 0) { Addr->PrefixLength = 0; } else { Addr->PrefixLength = 32; } return Status; } Status = NetLibStrToIp6andPrefix (Ptr, &Addr->Address.v6, &Addr->PrefixLength); if (!EFI_ERROR (Status) && (Addr->PrefixLength == 0xFF)) { Addr->PrefixLength = 128; } return Status; }
/** Pick up gw/dns IPv6 address in string format from Args with "-s" option and convert it to EFI_IPv6_ADDRESS format. @param[in, out] Arg The pointer of the address of ARG_LIST that save Args with the "-s" option. @param[out] Buf The pointer of the address of EFI_IPv6_ADDRESS. @param[out] BufSize The pointer of BufSize that describes the size of Buf in bytes. @retval EFI_SUCCESS The conversion is successful. @retval Others Doesn't find the host address, or it is an invalid IPv6 address in string format. **/ EFI_STATUS IfConfig6ParseGwDnsAddressList ( IN OUT ARG_LIST **Arg, OUT EFI_IPv6_ADDRESS **Buf, OUT UINTN *BufSize ) { EFI_STATUS Status; EFI_IPv6_ADDRESS *AddrBuf; ARG_LIST *VarArg; EFI_IPv6_ADDRESS Address; UINT8 Prefix; UINT8 AddrCnt; AddrCnt = 0; *BufSize = 0; *Buf = NULL; VarArg = *Arg; Status = EFI_SUCCESS; // // Go through the list to check the correctness of input gw/dns address. // while ((!EFI_ERROR (Status)) && (VarArg != NULL)) { Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix); if (EFI_ERROR (Status)) { // // gw ip ip ... host // break; } VarArg = VarArg->Next; AddrCnt++; } if (AddrCnt == 0) { return EFI_INVALID_PARAMETER; } AddrBuf = AllocateZeroPool (AddrCnt * sizeof (EFI_IPv6_ADDRESS)); ASSERT (AddrBuf != NULL); AddrCnt = 0; VarArg = *Arg; Status = EFI_SUCCESS; // // Go through the list to fill in the EFI_IPv6_ADDRESS structure. // while ((!EFI_ERROR (Status)) && (VarArg != NULL)) { Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix); if (EFI_ERROR (Status)) { break; } IP6_COPY_ADDRESS (&AddrBuf[AddrCnt], &Address); VarArg = VarArg->Next; AddrCnt++; } *Arg = VarArg; if (EFI_ERROR (Status) && (Status != EFI_INVALID_PARAMETER)) { goto ON_ERROR; } *Buf = AddrBuf; *BufSize = AddrCnt * sizeof (EFI_IPv6_ADDRESS); return EFI_SUCCESS; ON_ERROR: FreePool (AddrBuf); return Status; }
/** Pick up host IPv6 address in string format from Args with "-s" option and convert it to EFI_IP6_CONFIG_MANUAL_ADDRESS format. @param[in, out] Arg The pointer of the address of ARG_LIST which save Args with the "-s" option. @param[out] Buf The pointer of the address of EFI_IP6_CONFIG_MANUAL_ADDRESS. @param[out] BufSize The pointer of BufSize that describes the size of Buf in bytes. @retval EFI_SUCCESS The convertion is successful. @retval Others Does't find the host address, or it is an invalid IPv6 address in string format. **/ EFI_STATUS IfConfig6ParseManualAddressList ( IN OUT ARG_LIST **Arg, OUT EFI_IP6_CONFIG_MANUAL_ADDRESS **Buf, OUT UINTN *BufSize ) { EFI_STATUS Status; EFI_IP6_CONFIG_MANUAL_ADDRESS *AddrBuf; ARG_LIST *VarArg; EFI_IPv6_ADDRESS Address; UINT8 Prefix; UINT8 AddrCnt; Prefix = 0; AddrCnt = 0; *BufSize = 0; *Buf = NULL; VarArg = *Arg; Status = EFI_SUCCESS; // // Go through the list to check the correctness of input host ip6 address. // while ((!EFI_ERROR (Status)) && (VarArg != NULL)) { Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix); if (EFI_ERROR (Status)) { // // host ip ip ... gw // break; } VarArg = VarArg->Next; AddrCnt++; } if (AddrCnt == 0) { return EFI_INVALID_PARAMETER; } AddrBuf = AllocateZeroPool (AddrCnt * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)); ASSERT (AddrBuf != NULL); AddrCnt = 0; VarArg = *Arg; Status = EFI_SUCCESS; // // Go through the list to fill in the EFI_IP6_CONFIG_MANUAL_ADDRESS structure. // while ((!EFI_ERROR (Status)) && (VarArg != NULL)) { Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix); if (EFI_ERROR (Status)) { break; } // // If prefix length is not set, set it as Zero here. In the IfConfigSetInterfaceInfo() // Zero prefix, length will be transfered to default prefix length. // if (Prefix == 0xFF) { Prefix = 0; } AddrBuf[AddrCnt].IsAnycast = FALSE; AddrBuf[AddrCnt].PrefixLength = Prefix; IP6_COPY_ADDRESS (&AddrBuf[AddrCnt].Address, &Address); VarArg = VarArg->Next; AddrCnt++; } *Arg = VarArg; if (EFI_ERROR (Status) && (Status != EFI_INVALID_PARAMETER)) { goto ON_ERROR; } *Buf = AddrBuf; *BufSize = AddrCnt * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS); return EFI_SUCCESS; ON_ERROR: FreePool (AddrBuf); return Status; }