#!/bin/sh
<?
include "/htdocs/phplib/trace.php";
include "/htdocs/phplib/xnode.php";
include "/htdocs/phplib/phyinf.php";
function cmd($cmd) {echo $cmd."\n";}
function msg($msg) {cmd("echo [IP-WAIT]: ".$msg." > /dev/console");}
function error($m) {cmd("echo [IP-WAIT]: ERROR: ".$m); return 9;}
/***********************************************************************/
function main_entry($inf, $phyinf, $devnam, $dns, $me)
{
/* INF status path. */
$stsp = XNODE_getpathbytarget("/runtime", "inf", "uid", $inf, 0);
if ($stsp=="") return error($inf." has not runtime nodes !");
$infprev = query($stsp."/infprevious");
if($infprev!="")
{
$prevstsp = XNODE_getpathbytarget("/runtime", "inf", "uid", $infprev, 0);
$prevdevnam = query($prevstsp."/devnam");
$prevphyinf = query($prevstsp."/phyinf");
}
/* Preparing & Get M flag */
if(strstr($prevdevnam,"ppp")=="") $conf = "/var/run/".$devnam;
else $conf = "/var/run/".$prevdevnam;
$mflag = fread("e", $conf.".ra_mflag");
/* generate callback script */
$hlp = "/var/servd/".$inf."-rdisc6.sh";
$pid = "/var/servd/".$inf."-rdisc6.pid";
$child = query($stsp."/child/uid");
if($mflag=="") /* we don't receive ra */
{
//msg("mflag is null, kill rdisc6");
/* kill daemon */
cmd("/etc/scripts/killpid.sh ".$pid);
/* check if interface if ppp */
if(strstr($prevdevnam,"ppp")=="")
{
if(strstr($prevdevnam,"sit")=="")
cmd("rdisc6 -c ".$hlp." -p ".$pid." -q ".$devnam." &");
else
{
//msg("SIT-Autoconf mode");
/* auto in sit mode */
$p = XNODE_getpathbytarget("/runtime", "phyinf", "uid", $prevphyinf, 0);
if($p!="") $ipaddr = query($p."/ipv6/link/ipaddr");
else return error("SIT tunnel need exist!! ");
msg("ipaddr: ".$ipaddr." and devnam: ".$prevdevnam);
cmd("rdisc6 -c ".$hlp." -p ".$pid." -q -e ".$ipaddr." ".$prevdevnam." &");
}
}
else
{
//msg("PPP-Autoconf mode");
/* need infprev */
$infprev = query($stsp."/infprevious");
$prevstsp = XNODE_getpathbytarget("/runtime", "inf", "uid", $infprev, 0);
/* need infprev */
$atype = query($prevstsp."/inet/addrtype");
if($atype == "ipv6")
{
$ipaddr = query($prevstsp."/inet/ipv6/ipaddr");/* share session with ipv4*/
}
else if($atype == "ppp6")
{
$ipaddr = query($prevstsp."/inet/ppp6/local");/* only ipv6 session */
}
else return error($inf." has wrong addrtype of infprevious");
cmd("rdisc6 -c ".$hlp." -p ".$pid." -q -e ".$ipaddr." ".$prevdevnam." &");
}
//cmd("sleep 5");
cmd('xmldbc -t "ra.iptest.'.$inf.':10:'.$me.'"');
return 0;
}
/* Preparing & Get M flag */
$mflag = fread("e", $conf.".ra_mflag");
$oflag = fread("e", $conf.".ra_oflag");
$rdnss = fread("e", $conf.".ra_rdnss");
$dnssl = fread("e", $conf.".ra_dnssl");
/* need dnssl info */
if($dnssl!="")
{
msg("DNSSL :".$dnssl);
XNODE_set_var($child."_DOMAIN",$dnssl);
}
if($mflag!="")
{
if(strstr($prevdevnam,"ppp")=="") msg($inf."/".$devnam.", M=[".$mflag."], O=[".$oflag."]");
else msg($inf."/".$prevdevnam.", M=[".$mflag."], O=[".$oflag."]");
}
$p = XNODE_getpathbytarget("/runtime", "phyinf", "uid", $phyinf, 0);
if ($p=="") return error($phyinf." has not runtime nodes!");
if ($mflag!="")
{
/* we got ra */
$mac = PHYINF_getphymac($inf);
$hostid = ipv6eui64($mac);
$ra_prefix = fread("e", $conf.".ra_prefix");
$prefix = fread("e", $conf.".ra_prefix_len");
$ra_saddr = fread("e", $conf.".ra_saddr");
$ipaddr = ipv6ip($ra_prefix, $prefix, $hostid, 0, 0);
$router = fread("e", $conf.".ra_saddr");
if(strstr($prevdevnam,"ppp")!="")
{
$p = XNODE_getpathbytarget("/runtime", "phyinf", "uid", $prevphyinf, 0);
$llipaddr = query($p."/ipv6/link/ipaddr");
$hostid = ipv6hostid($llipaddr,64);
$ipaddr = ipv6ip($ra_prefix, $prefix, $hostid, 0, 0);
}
//if ($ipaddr!="")
if ($ra_saddr!="")
{
if ($oflag=="0" && $dns=="" && $rdnss!="") {$dns=$rdnss;}
$defrt = query($stsp."/defaultroute");
if($defrt!="" && $defrt>0 && $router!="")
{
/* add default route and runtime node*/
$gateway = query($stsp."/inet/ipv6/gateway");
if($gateway!="")
{
cmd("ip -6 route del default via ".$gateway." dev ".$devnam." metric ".$defrt);
del($stsp."/inet/ipv6/gateway");
}
cmd("ip -6 route add default via ".$router." dev ".$devnam." metric ".$defrt);
set($stsp."/inet/ipv6/gateway",$router);
/* Replace runtime dynamic route */
/*
$base = "/runtime/dynamic/route6";
$cnt = query($base."/entry#");
$i=1;
$found=0;
while($i<=$cnt)
{
$dest = query($base."/entry:".$i."/ipaddr");
$pfx = query($base."/entry:".$i."/prefix");
$dname = query($base."/entry:".$i."/inf");
if($dest=="::" && $pfx=="0" && $dname==$inf)
{
set($base."/entry:".$i."/gateway", $router);
$found=1;
break;
}
$i++;
}
if($found=="0")
{
set($base."/entry:".$i."/ipaddr", "::");
set($base."/entry:".$i."/prefix", "0");
set($base."/entry:".$i."/gateway", $router);
set($base."/entry:".$i."/metric", $defrt);
set($base."/entry:".$i."/inf", $inf);
}
*/
if($child!="")
{
set($stsp."/stateless/ipaddr", $ipaddr);
set($stsp."/stateless/prefix", $prefix);
set($stsp."/stateless/gateway", $router);
set($stsp."/stateless/dns", $dns);
}
if($child=="" && isfile("/var/run/".$inf.".UP")!=1)
{
cmd("phpsh /etc/scripts/IPV6.INET.php ACTION=ATTACH".
" MODE=STATELESS".
" INF=".$inf.
" DEVNAM=".$devnam.
" IPADDR=".$ipaddr.
" PREFIX=".$prefix.
" GATEWAY=".$router.
' "DNS='.$dns.'"');
}
}
}
return 0;
}
/* Not configured, try later. */
//cmd("killall rdisc6");
//cmd("/etc/scripts/killpid.sh /var/servd/".$inf."-rdisc6.pid");
//msg("mflag is null, kill rdisc6-part2");
//cmd("/etc/scripts/killpid.sh ".$pid);
//cmd("sleep 1");
//cmd('xmldbc -t "ra.iptest.'.$inf.':5:'.$me.'"');
//cmd('xmldbc -t "ra.iptest.'.$inf.':10:'.$me.'"');
//return 0;
}
/* Main entry */
main_entry(
$_GLOBALS["INF"],
$_GLOBALS["PHYINF"],
$_GLOBALS["DEVNAM"],
$_GLOBALS["DNS"],
$_GLOBALS["ME"]
);
?>