Skip to content

Commit 29ce831

Browse files
committed
IPv4 to number, number to IPv4 conversion
1 parent cdc9bae commit 29ce831

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

basic_rest_functions.sh

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,109 @@ function make_ipam_subnet_str(){
273273
echo "$iss"
274274
}
275275

276+
## @fn ipv4_to_number()
277+
## @brief converts an IPv4 address into the number
278+
function ipv4_to_number() {
279+
local ipv4_address=$1
280+
local octets=
281+
local oct=
282+
local number=0
283+
local n=1
284+
local k=3
285+
IFS='.'
286+
read -ra octets <<< "$ipv4_address"
287+
288+
if [ ${#octets[@]} -ne 4 ]
289+
then
290+
echo "0"
291+
return 1
292+
fi
293+
294+
while [ $k -ge 0 ]
295+
do
296+
oct=${octets[$k]}
297+
number=`expr $oct \* $n + $number`
298+
n=`expr 256 \* $n`
299+
k=`expr $k - 1`
300+
done
301+
echo "$number"
302+
}
303+
304+
## @fn number_to_ipv4()
305+
## @brief Converts a number to IPv4 address
306+
function number_to_ipv4() {
307+
local number=$1
308+
local ipv4=
309+
310+
oct1n=1
311+
oct2n="$((256))"
312+
oct3n="$((256*256))"
313+
oct4n="$((256*256*256))"
314+
315+
oct="$(($number / $oct4n))"
316+
ipv4="$oct"
317+
number="$(($number - $oct*$oct4n))"
318+
319+
oct="$(($number / $oct3n))"
320+
ipv4="$ipv4"."$oct"
321+
number="$(($number - $oct*$oct3n))"
322+
323+
oct="$(($number / $oct2n))"
324+
ipv4="$ipv4"."$oct"
325+
number="$(($number - $oct*$oct2n))"
326+
327+
oct="$(($number / $oct1n))"
328+
ipv4="$ipv4"."$oct"
329+
330+
echo "$ipv4"
331+
}
332+
333+
## @fn split_network_by24()
334+
## @brief splits the given network by 24 mask subnets
335+
function split_network_by24() {
336+
local net_prefix=$1
337+
338+
local net_prefix_len=${net_prefix#*"/"}
339+
local slash_pos=$(( ${#net_prefix} - ${#net_prefix_len} - 1 ))
340+
local net_addr="${net_prefix:0:$slash_pos}"
341+
local net_power="$((32 - $net_prefix_len))"
342+
343+
local net_number=`ipv4_to_number $net_addr`
344+
345+
local subnets=
346+
local subnet24_prefix
347+
348+
if [ $net_prefix_len -ge 24 ]
349+
then
350+
echo "$net_prefix"
351+
return 1
352+
fi
353+
354+
if [ $net_number -eq 0 ]
355+
then
356+
echo "0.0.0.0/24"
357+
return 1
358+
fi
359+
360+
local host_number="$((2**$net_power))"
361+
local next_net_number="$(($net_number + $host_number))"
362+
local net24_number=$net_number
363+
local networks24=
364+
local net24_addr=
365+
while [ $net24_number -lt $next_net_number ]
366+
do
367+
net24_addr=`number_to_ipv4 $net24_number`
368+
if [ "$networks24" = "" ]
369+
then
370+
networks24="$net24_addr/24"
371+
else
372+
networks24="$networks24 $net24_addr/24"
373+
fi
374+
net24_number="$(($net24_number + 256))"
375+
done
376+
echo "$networks24"
377+
}
378+
276379
## @fn make_random_ipv4_address()
277380
## @brief Creates random IPv4 address
278381
function make_random_ipv4_address(){

0 commit comments

Comments
 (0)