# support for RFC3442 routes in DHCP RENEW function convert_to_cidr () { cidr="" set -- $1 while [ $# -gt 0 ]; do net_length=$1 case $net_length in 32|31|30|29|28|27|26|25) if [ $# -lt 9 ]; then return 1 fi net_address="${2}.${3}.${4}.${5}" gateway="${6}.${7}.${8}.${9}" shift 9 ;; 24|23|22|21|20|19|18|17) if [ $# -lt 8 ]; then return 1 fi net_address="${2}.${3}.${4}.0" gateway="${5}.${6}.${7}.${8}" shift 8 ;; 16|15|14|13|12|11|10|9) if [ $# -lt 7 ]; then return 1 fi net_address="${2}.${3}.0.0" gateway="${4}.${5}.${6}.${7}" shift 7 ;; 8|7|6|5|4|3|2|1) if [ $# -lt 6 ]; then return 1 fi net_address="${2}.0.0.0" gateway="${3}.${4}.${5}.${6}" shift 6 ;; 0) # default route if [ $# -lt 5 ]; then return 1 fi net_address="0.0.0.0" gateway="${2}.${3}.${4}.${5}" shift 5 ;; *) # error return 1 ;; esac cidr+="${net_address}/${net_length}:${gateway} " done } # main script starts here RUN="yes" if [ "$RUN" = "yes" ]; then convert_to_cidr "$old_rfc3442_classless_static_routes" old_cidr=$cidr convert_to_cidr "$new_rfc3442_classless_static_routes" new_cidr=$cidr if [ "$reason" = "RENEW" ]; then if [ "$new_rfc3442_classless_static_routes" != "$old_rfc3442_classless_static_routes" ]; then logmsg info "RFC3442 route change detected, old_routes: $old_rfc3442_classless_static_routes" logmsg info "RFC3442 route change detected, new_routes: $new_rfc3442_classless_static_routes" if [ -z "$new_rfc3442_classless_static_routes" ]; then # delete all routes from the old_rfc3442_classless_static_routes for route in $old_cidr; do network=$(printf "${route}" | awk -F ":" '{print $1}') gateway=$(printf "${route}" | awk -F ":" '{print $2}') # take care of link-local routes if [ "${gateway}" != '0.0.0.0' ]; then via_arg="via ${gateway}" else via_arg="" fi ip -4 route del "${network}" "${via_arg}" dev "${interface}" >/dev/null 2>&1 done elif [ -z "$old_rfc3442_classless_static_routes" ]; then # add all routes from the new_rfc3442_classless_static_routes for route in $new_cidr; do network=$(printf "${route}" | awk -F ":" '{print $1}') gateway=$(printf "${route}" | awk -F ":" '{print $2}') # take care of link-local routes if [ "${gateway}" != '0.0.0.0' ]; then via_arg="via ${gateway}" else via_arg="" fi ip -4 route add "${network}" "${via_arg}" dev "${interface}" >/dev/null 2>&1 done else # update routes # delete old for old_route in $old_cidr; do match="false" for new_route in $new_cidr; do if [[ "$old_route" == "$new_route" ]]; then match="true" break fi done if [[ "$match" == "false" ]]; then # delete old_route network=$(printf "${old_route}" | awk -F ":" '{print $1}') gateway=$(printf "${old_route}" | awk -F ":" '{print $2}') # take care of link-local routes if [ "${gateway}" != '0.0.0.0' ]; then via_arg="via ${gateway}" else via_arg="" fi ip -4 route del "${network}" "${via_arg}" dev "${interface}" >/dev/null 2>&1 fi done # add new for new_route in $new_cidr; do match="false" for old_route in $old_cidr; do if [[ "$new_route" == "$old_route" ]]; then match="true" break fi done if [[ "$match" == "false" ]]; then # add new_route network=$(printf "${new_route}" | awk -F ":" '{print $1}') gateway=$(printf "${new_route}" | awk -F ":" '{print $2}') # take care of link-local routes if [ "${gateway}" != '0.0.0.0' ]; then via_arg="via ${gateway}" else via_arg="" fi ip -4 route add "${network}" "${via_arg}" dev "${interface}" >/dev/null 2>&1 fi done fi fi fi fi