Found this patch here:
https://lists.isc.org/pipermail/dhcp-users/2011-January/012910.html

and made some adjustments/updates to make it work with this version.
Wasn't able to find that why this patch was not accepted by ISC DHCP developers.

Upstream-Status: Pending

Signed-off-by: Muhammad Shakeel <muhammad_shakeel@mentor.com>

--- dhcp-4.2.5-P1/client/scripts/linux.orig	2013-09-04 12:22:55.000000000 +0500
+++ dhcp-4.2.5-P1/client/scripts/linux	2013-09-04 12:52:19.068761518 +0500
@@ -103,17 +103,11 @@
 if [ x$old_broadcast_address != x ]; then
   old_broadcast_arg="broadcast $old_broadcast_address"
 fi
-if [ x$new_subnet_mask != x ]; then
-  new_subnet_arg="netmask $new_subnet_mask"
-fi
-if [ x$old_subnet_mask != x ]; then
-  old_subnet_arg="netmask $old_subnet_mask"
-fi
-if [ x$alias_subnet_mask != x ]; then
-  alias_subnet_arg="netmask $alias_subnet_mask"
+if [ -n "$new_subnet_mask" ]; then
+    new_mask="/$new_subnet_mask"
 fi
-if [ x$new_interface_mtu != x ]; then
-  mtu_arg="mtu $new_interface_mtu"
+if [ -n "$alias_subnet_mask" ]; then
+    alias_mask="/$alias_subnet_mask"
 fi
 if [ x$IF_METRIC != x ]; then
   metric_arg="metric $IF_METRIC"
@@ -127,9 +121,9 @@
 if [ x$reason = xPREINIT ]; then
   if [ x$alias_ip_address != x ]; then
     # Bring down alias interface. Its routes will disappear too.
-    ifconfig $interface:0- inet 0
+    ${ip} -4 addr flush dev ${interface} label ${interface}:0
   fi
-  ifconfig $interface 0 up
+  ${ip} link set dev ${interface} up
 
   # We need to give the kernel some time to get the interface up.
   sleep 1
@@ -156,25 +150,30 @@
   if [ x$old_ip_address != x ] && [ x$alias_ip_address != x ] && \
 		[ x$alias_ip_address != x$old_ip_address ]; then
     # Possible new alias. Remove old alias.
-    ifconfig $interface:0- inet 0
+    ${ip} -4 addr flush dev ${interface} label ${interface}:0
   fi
   if [ x$old_ip_address != x ] && [ x$old_ip_address != x$new_ip_address ]; then
     # IP address changed. Bringing down the interface will delete all routes,
     # and clear the ARP cache.
-    ifconfig $interface inet 0 down
+    ${ip} -4 addr flush dev ${interface} label ${interface}
 
   fi
   if [ x$old_ip_address = x ] || [ x$old_ip_address != x$new_ip_address ] || \
      [ x$reason = xBOUND ] || [ x$reason = xREBOOT ]; then
 
-    ifconfig $interface inet $new_ip_address $new_subnet_arg \
-					$new_broadcast_arg $mtu_arg
+    ${ip} -4 addr add ${new_ip_address}${new_mask} ${new_broadcast_arg} \
+                dev ${interface} label ${interface}
+    if [ -n "$new_interface_mtu" ]; then
+      # set MTU
+      ${ip} link set dev ${interface} mtu ${new_interface_mtu}
+    fi
     # Add a network route to the computed network address.
     for router in $new_routers; do
       if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then
-	route add -host $router dev $interface
+        ${ip} -4 route add ${router} dev $interface >/dev/null 2>&1
       fi
-      route add default gw $router $metric_arg dev $interface
+      ${ip} -4 route add default via ${router} dev ${interface} \
+        ${metric_arg} >/dev/null 2>&1
     done
   else
     # we haven't changed the address, have we changed other options           
@@ -182,21 +181,23 @@
     if [ x$new_routers != x ] && [ x$new_routers != x$old_routers ] ; then
       # if we've changed routers delete the old and add the new.
       for router in $old_routers; do
-        route del default gw $router
+        ${ip} -4 route delete default via ${router}
       done
       for router in $new_routers; do
         if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then
-	  route add -host $router dev $interface
-	fi
-	route add default gw $router $metric_arg dev $interface
+	      ${ip} -4 route add ${router} dev $interface >/dev/null 2>&1
+	    fi
+        ${ip} -4 route add default via ${router} dev ${interface} \
+          ${metric_arg} >/dev/null 2>&1
       done
     fi
   fi
   if [ x$new_ip_address != x$alias_ip_address ] && [ x$alias_ip_address != x ];
    then
-    ifconfig $interface:0- inet 0
-    ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
-    route add -host $alias_ip_address $interface:0
+    ${ip} -4 addr flush dev ${interface} label ${interface}:0
+    ${ip} -4 addr add ${alias_ip_address}${alias_mask} \
+        dev ${interface} label ${interface}:0
+    ${ip} -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1
   fi
   make_resolv_conf
   exit_with_hooks 0
@@ -206,42 +207,49 @@
    || [ x$reason = xSTOP ]; then
   if [ x$alias_ip_address != x ]; then
     # Turn off alias interface.
-    ifconfig $interface:0- inet 0
+    ${ip} -4 addr flush dev ${interface} label ${interface}:0
   fi
   if [ x$old_ip_address != x ]; then
     # Shut down interface, which will delete routes and clear arp cache.
-    ifconfig $interface inet 0 down
+    ${ip} -4 addr flush dev ${interface} label ${interface}
   fi
   if [ x$alias_ip_address != x ]; then
-    ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
-    route add -host $alias_ip_address $interface:0
+    ${ip} -4 addr add ${alias_ip_address}${alias_network_arg} \
+        dev ${interface} label ${interface}:0
+    ${ip} -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1
   fi
   exit_with_hooks 0
 fi
 
 if [ x$reason = xTIMEOUT ]; then
   if [ x$alias_ip_address != x ]; then
-    ifconfig $interface:0- inet 0
+    ${ip} -4 addr flush dev ${interface} label ${interface}:0
+  fi
+  ${ip} -4 addr add ${new_ip_address}${new_mask} ${new_broadcast_arg} \
+            dev ${interface} label ${interface}
+  if [ -n "$new_interface_mtu" ]; then
+    # set MTU
+    ip link set dev ${interface} mtu ${new_interface_mtu}
   fi
-  ifconfig $interface inet $new_ip_address $new_subnet_arg \
-					$new_broadcast_arg $mtu_arg
   set $new_routers
   if ping -q -c 1 $1; then
     if [ x$new_ip_address != x$alias_ip_address ] && \
 			[ x$alias_ip_address != x ]; then
-      ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
-      route add -host $alias_ip_address dev $interface:0
+      ${ip} -4 addr add ${alias_ip_address}${alias_mask} \
+            dev ${interface} label ${interface}:0
+      ${ip} -4 route add ${alias_ip_address} dev ${interface} >/dev/null 2>&1
     fi
     for router in $new_routers; do
       if [ "x$new_subnet_mask" = "x255.255.255.255" ] ; then
-	route add -host $router dev $interface
+	    ${ip} -4 route add ${router} dev $interface >/dev/null 2>&1
       fi
-      route add default gw $router $metric_arg dev $interface
+      ${ip} -4 route add default via ${router} dev ${interface} \
+        ${metric_arg} >/dev/null 2>&1
     done
     make_resolv_conf
     exit_with_hooks 0
   fi
-  ifconfig $interface inet 0 down
+  ${ip} -4 addr flush dev ${interface}
   exit_with_hooks 1
 fi
 
