diff options
author | William A. Kennington III <wak@google.com> | 2021-05-10 13:07:14 +0300 |
---|---|---|
committer | William A. Kennington III <wak@google.com> | 2021-05-11 23:33:02 +0300 |
commit | 80776788b1946fbbe0748a54b18cb1b28c03a8ad (patch) | |
tree | d2367a4195e1aae8d1e4464bce427ecca205e5b7 /meta-google | |
parent | 1819d8176a3380fd13b958275c678ec24c462aaf (diff) | |
download | openbmc-80776788b1946fbbe0748a54b18cb1b28c03a8ad.tar.xz |
meta-google: network-sh: Add ip_bytes_to_str
This makes it possible to get a human readable address back from a byte
array.
Change-Id: Ifcc98bcc95b8d75fe7d1aae1c264cbddf3fc5bd0
Signed-off-by: William A. Kennington III <wak@google.com>
Diffstat (limited to 'meta-google')
-rw-r--r-- | meta-google/recipes-google/networking/network-sh/lib.sh | 54 | ||||
-rwxr-xr-x | meta-google/recipes-google/networking/network-sh/test.sh | 30 |
2 files changed, 84 insertions, 0 deletions
diff --git a/meta-google/recipes-google/networking/network-sh/lib.sh b/meta-google/recipes-google/networking/network-sh/lib.sh index 2dc5103e08..04e1480d73 100644 --- a/meta-google/recipes-google/networking/network-sh/lib.sh +++ b/meta-google/recipes-google/networking/network-sh/lib.sh @@ -153,6 +153,60 @@ ip_to_bytes() { bytes_out=("${bytes[@]}") } +ip_bytes_to_str() { + local -n bytes="$1" + + if (( "${#bytes[@]}" == 4 )); then + printf '%d.%d.%d.%d\n' "${bytes[@]}" + elif (( "${#bytes[@]}" == 16 )); then + # Track the starting position of the longest run of 0 hextets (2 bytes) + local longest_i=0 + # Track the size of the longest run of 0 hextets + local longest_s=0 + # The index of the first 0 byte in the current run of zeros + local first_zero=0 + local i + # Find the location of the longest run of zero hextets, preferring same + # size runs later in the address. + for (( i=0; i<=16; i+=2 )); do + # Terminate the run of zeros if we are at the end of the array or + # have a non-zero hextet + if (( i == 16 || bytes[$i] != 0 || bytes[$((i+1))] != 0 )); then + local s=$((i - first_zero)) + if (( s >= longest_s )); then + longest_i=$first_zero + longest_s=$s + fi + first_zero=$((i+2)) + fi + done + # Build the address string by each hextet + for (( i=0; i<16; i+=2 )); do + # If we encountered a run of zeros, add the necessary :: at the end + # of the string. If not at the end, a single : is added since : is + # printed to subsequent hextets already. + if (( i == longest_i )); then + (( i += longest_s-2 )) + printf ':' + # End of string needs to be :: + if (( i == 14 )); then + printf ':' + fi + else + # Prepend : to all hextets except the first for separation + if (( i != 0 )); then + printf ':' + fi + printf '%x' $(( (bytes[$i]<<8) | bytes[$(($i+1))])) + fi + done + printf '\n' + else + echo "Invalid IP Bytes: ${bytes[*]}" >&2 + return 1 + fi +} + ipv6_pfx_concat() { local pfx="$1" local sfx="$2" diff --git a/meta-google/recipes-google/networking/network-sh/test.sh b/meta-google/recipes-google/networking/network-sh/test.sh index 2361cfe3e8..33cab86aa1 100755 --- a/meta-google/recipes-google/networking/network-sh/test.sh +++ b/meta-google/recipes-google/networking/network-sh/test.sh @@ -114,6 +114,36 @@ test_ip6_to_bytes() { out=() } +test_ip4_bytes_str() { + in=(10 0 255 1) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" '10.0.255.1' +} + +test_ip6_bytes_str() { + in=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" '::' + in=(0xfd 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" 'fd00::' + in=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0xfd) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" '::fd' + in=(0xfd 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" 'fd01::1' + in=(0xfd 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" 'fd01::1:0:0:1' + in=(0xfd 1 0 0 0 0 0 1 0 1 0 0 0 0 0 1) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" 'fd01:0:0:1:1::1' + in=(0 1 0 1 0xdd 0xdd 0 1 0 1 0 1 0 1 0 1) + str="$(ip_bytes_to_str in)" || fail + expect_streq "$str" '1:1:dddd:1:1:1:1:1' +} + test_ipv6_pfx_concat() { # Invalid inputs expect_err 1 ipv6_pfx_concat 'fd/64' '1234:5678:90af' |