#!/bin/bash

# BS networks must in the end of JUMBO_NETWORKS array!

VLANS="538 617 641 642 650 660 619 519" # automatically updated nets of VLANs; comment after net definition required
JUMBO_NETWORKS=("77.88.38.192/26 93.158.155.128/26 95.108.129.192/27 95.108.189.64/27 178.154.224.64/26 213.180.206.192/28" # VLAN660 \
		"2a02:6b8:0:220::/64 2a02:6b8:0:620::/64 2a02:6b8:0:1420::/64" \
		"37.9.89.112/28 77.88.34.96/27 84.201.146.144/28 84.201.148.48/28 93.158.158.128/26 178.154.224.0/27 213.180.206.208/29" # VLAN650 \
		"93.158.158.64/28 95.108.148.0/26" # VLAN617 \
		"77.88.10.0/27 77.88.33.128/26 77.88.57.192/26 87.250.243.24/29 87.250.246.128/27 95.108.197.104/29 141.8.157.24/29" # VLAN642 \
		"5.45.250.0/23 77.88.33.0/25 77.88.37.0/24 84.201.143.64/27 87.250.224.0/24 93.158.128.0/24 95.108.143.0/24 141.8.191.0/24 178.154.128.0/27 178.154.189.128/25 178.154.240.0/23 199.21.99.128/27" # VLAN641 \
		"84.201.156.16/29 87.250.244.128/25" # VLAN538 \
                "95.108.242.0/26 141.8.172.0/25" # VLAN619 \
                "5.45.218.0/23 84.201.131.0/24" # VLAN519 \
)


JUMBO_TABLE=250
JUMBO_RULE=30000

enable_jumbo () {
    local ip="ip $1"
    local local_net=$2
    [ "$ADDRFAM" = "inet6" -a -f "/proc/sys/net/ipv6/conf/$IFACE/accept_ra" -a `cat "/proc/sys/net/ipv6/conf/$IFACE/accept_ra"` -eq 1 ] && ROUTE_ADV=1
    [ "$ROUTE_ADV" ] && sleep 10 # receive router advertisement
    local default_gw=$($ip route ls | grep default | cut -f 3 -d ' ')
    local default_dev=$($ip route ls | grep default | cut -f 5 -d ' ')
    if [ "$ADDRFAM" = "inet6" -a -z "$ROUTE_ADV" -a -z "$default_gw" ]; then
        default_gw=`echo $local_net | cut -d/ -f1`::
        default_dev=$IFACE
    fi
    $ip route del default dev $default_dev
    $ip route add default via $default_gw dev $default_dev metric $IF_METRIC mtu 1450 advmss 1410
    for i in `seq 0 $((${#JUMBO_NETWORKS[@]} - 1))`; do
        echo ${JUMBO_NETWORKS[$i]} | grep -q $local_net
        if [ $? -eq 0 ]; then 
            found=$i
            break
        fi
    done
    [ -z $found ] && return
    [ "$found" -ge 5 ] && found="5 6"; # UGLY HACK, hardcoded for BS nets, that started from 5, array index started from 0
    				       # If you want to add new NOT BS network, you must increase all numbers by 1 and put this network BEFORE BS nets
				       # If you want to add new BS network, you must put this network in the end and add one more number to found array
    for ugly in $found; do
    for net_def in ${JUMBO_NETWORKS[$ugly]} ; do
	if [ "$local_net" == "$net_def" ]; then 
		# because network is local, set route without default gw
		ip route replace $net_def dev $IFACE mtu 8950 table $JUMBO_TABLE
	else
        	ip route replace $net_def dev $IFACE mtu 8950 table $JUMBO_TABLE via $default_gw 
	fi
    done
    done
    $ip rule add from all lookup $JUMBO_TABLE pref $JUMBO_RULE
}

disable_jumbo () {
    ip $1 rule del from all lookup $JUMBO_TABLE pref $JUMBO_RULE
}

add_static_routes() {

  	# Routes only for BS networks
	networks="178.154.132.0/22 95.108.254.128/25";
	mynet=`ip ro sh | grep vlan741 | grep scope | awk '{print $1 }'`;
	router=`ipcalc $mynet | grep 'HostMax:' | awk '{ print $2 }'`;

        for net in $networks; do
		if [ -n "$route" ]; then
			echo "Adding route $net via $router"
                       	ip route add $net via $router mtu 8950 table $JUMBO_TABLE;
		fi
        done
}

#echo $IFACE | grep -q "741";
#[ $? -eq 0 ] && [ "$MODE" = start -a "$PHASE" = post-up ] && add_static_routes;

echo $IFACE | grep -q "eth[0-9]\+$"
if [ $? -eq 0 ] ; then
    if [ "$MODE" = start -a "$PHASE" = post-up ] ; then
        if [ "$ADDRFAM" = "inet" ]; then
            if [ -z $IF_NETWORK ]; then # dhcp client does not provide IF_ stanzas
                ADDRESS=`ip address show $IFACE | grep -w inet | awk '{print $2}'`
                NETWORK=`ipcalc -nb $ADDRESS | grep Network | awk '{print $2}'`
                IF_NETWORK=`echo $NETWORK | cut -d/ -f1`
                NETMASK=`echo $NETWORK | cut -d/ -f2`
            else
                NETMASK=$(( `ipcalc -nb 0/$IF_NETMASK | grep Netmask | cut -d= -f2` ))
            fi

            # ipcalc is much easier
            # for history
            #NETMASK=`perl -e "print 32-log(2**32-unpack('N',pack('C4',split(/\./,'$IF_NETMASK'))))/log(2)"`

            for VLAN in $VLANS
            do
                NETS=`wget -T5 -q -O- "http://ro.admin.yandex-team.ru/api/net_query.sbml?vlan=$VLAN" | sort -n | head -c-1 | tr '\n' ' '`
                [ "$NETS" ] && sed -i "s|\".*\(\" # VLAN$VLAN\)|\"$NETS\1|" /etc/network/if-up.d/030jumbo-frames
            done
            enable_jumbo "" $IF_NETWORK/$NETMASK
        elif [ "$ADDRFAM" = "inet6" ]; then
            LOCAL_NET6=`echo $IF_ADDRESS | cut -d: -f-4`
            enable_jumbo -6 ${LOCAL_NET6}::/$IF_NETMASK 
        fi
    elif [ "$MODE" = stop -a "$PHASE" = pre-down ] ; then
        [ "$ADDRFAM" = "inet" ] && disable_jumbo
        [ "$ADDRFAM" = "inet6" ] && disable_jumbo -6
    fi
fi

exit 0

