#!/bin/bash
# vim: set tabstop=4 shiftwidth=4 expandtab:

# PROVIDE: ya-ipoib-interconnect
# REQUIRE: atm1 cleanvar FILESYSTEMS serial sppp sysctl
# REQUIRE: ipfilter ipfs
# REQUIRE: netif
# REQUIRE: openibd



if=`/etc/init.d/openibd status | grep -A 1 "Configured IPoIB devices" | grep ib`
network="192.168."
prefix=22
broadcast="192.168.3.255"
mtu=65520

if [ ! -n "$if" ]; then
    echo "No IPoIB interface found"
    exit 1
fi

_hostname=`hostname`

if [ ! -n "$_hostname" ]; then
    echo "The host without hostname, error..."
    exit 1
fi

_get_ip_from_hostname()
{
    _interface_ip_oct4=$((10#$(echo $1 | sed -rn 's/[^[:digit:]]*([[:digit:]]*)+[^[:digit:]]*/\1 /p') % 256))
    _interface_ip_oct3=$((1 + 10#$(echo $1 | sed -rn 's/[^[:digit:]]*([[:digit:]]*)+[^[:digit:]]*/\1 /p') / 256))

    echo "192.168."${_interface_ip_oct3}"."${_interface_ip_oct4}
}

ya_ipoib_interconnect_start()
{
    echo "IPoIB interconnect starting..."
    #force connected mode
    echo connected > /sys/class/net/${if}/mode
#    echo datagram > /sys/class/net/${if}/mode
    ip link set "${if}" up
    carrier_file="/sys/class/net/${if}/carrier"
    if [ -r ${carrier_file} ]; then
        _counter=0
        while [ ! -n "$(cat ${carrier_file} 2>/dev/null)" ]; do
            if [ $_counter == 0 ]; then
                echo -n "no carrier... waiting for 10 sec..."
            fi
            sleep 1
            _counter=$(($_counter + 1))
            echo -n "$_counter "
            if [ $_counter == 10 ]; then
                echo " error"
                ip link set "${if}" down
                exit 1
            fi
        done
    fi
    _ip=$(_get_ip_from_hostname $_hostname)
    ip link set mtu ${mtu} dev "${if}"
    ip addr add ${_ip}/${prefix} dev "${if}" broadcast ${broadcast}
 
}

ya_ipoib_interconnect_stop()
{
    echo "IPoIB interconnect stoping..."
    _ip=$(_get_ip_from_hostname $_hostname)
    ip addr del ${_ip}/${prefix} dev "${if}" broadcast ${broadcast}
    ip link set "${if}" down
    sleep 1
}

ya_ipoib_interconnect_reload()
{
    echo "IPoIB interconnect reloading..."
    ya_ipoib_interconnect_stop
    ya_ipoib_interconnect_start
}

case "$1" in
  start)
        ya_ipoib_interconnect_start
        ;;
  stop)
        ya_ipoib_interconnect_stop
        ;;
  restart|force-reload)
        ya_ipoib_interconnect_reload
        ;;
esac

