package org.freertr.clnt; import org.freertr.addr.addrEmpty; import org.freertr.addr.addrIP; import org.freertr.addr.addrType; import org.freertr.cfg.cfgVrf; import org.freertr.ifc.ifcDn; import org.freertr.ifc.ifcNull; import org.freertr.ifc.ifcUp; import org.freertr.ip.ipFwd; import org.freertr.ip.ipFwdMpmp; import org.freertr.pack.packHolder; import org.freertr.user.userTerminal; import org.freertr.util.bits; import org.freertr.util.counter; import org.freertr.util.debugger; import org.freertr.util.logger; import org.freertr.util.state; /** * point to multipoint mldp tunnel client * * @author matecsaba */ public class clntMplsLdpP2mp implements Runnable, ifcDn { /** * create instance */ public clntMplsLdpP2mp() { } /** * upper layer */ public ifcUp upper = new ifcNull(); /** * multipoint to multipoint */ public boolean mp2mp; /** * preferred ip protocol version */ public int prefer = 0; /** * target of tunnel */ public String target = null; /** * vrf of target */ public cfgVrf vrf = null; /** * tunnel id */ public int trgId; /** * experimental value, -1 means maps out */ public int expr = -1; /** * entrp[y value, -1 means maps out */ public int entr = -1; /** * ttl value */ public int ttl = 255; /** * counter */ public counter cntr = new counter(); private boolean working = true; private ipFwd fwdCor; private addrIP fwdTrg; private ipFwdMpmp mpLsp; public String toString() { return "p2mpldp to " + fwdTrg; } /** * get hw address * * @return hw address */ public addrType getHwAddr() { return new addrEmpty(); } /** * set filter * * @param promisc promiscous mode */ public void setFilter(boolean promisc) { } /** * get state * * @return state */ public state.states getState() { return state.states.up; } /** * close interface */ public void closeDn() { clearState(); } /** * flap interface */ public void flapped() { clearState(); } /** * set upper layer * * @param server upper layer */ public void setUpper(ifcUp server) { upper = server; upper.setParent(this); } /** * get counter * * @return counter */ public counter getCounter() { return cntr; } /** * get mtu size * * @return mtu size */ public int getMTUsize() { return 1500; } /** * get bandwidth * * @return bandwidth */ public long getBandwidth() { return 8000000; } /** * send packet * * @param pck packet */ public void sendPack(packHolder pck) { if (mpLsp == null) { return; } pck.getSkip(2); cntr.tx(pck); if (expr >= 0) { pck.MPLSexp = expr; } if (entr > 0) { pck.MPLSrnd = entr; } if (ttl >= 0) { pck.MPLSttl = ttl; } mpLsp.sendPack(fwdCor, pck); } /** * start connection */ public void workStart() { if (debugger.clntMplsLdpTraf) { logger.debug("starting work"); } new Thread(this).start(); } /** * stop connection */ public void workStop() { if (debugger.clntMplsLdpTraf) { logger.debug("stopping work"); } working = false; clearState(); } public void run() { for (;;) { if (!working) { break; } try { clearState(); workDoer(); } catch (Exception e) { logger.traceback(e); } clearState(); bits.sleep(1000); } } private void workDoer() { fwdTrg = userTerminal.justResolv(target, prefer); if (fwdTrg == null) { return; } fwdCor = vrf.getFwd(fwdTrg); mpLsp = ipFwdMpmp.create4tunnel(mp2mp, fwdTrg, trgId); fwdCor.mldpAdd(mpLsp); if (debugger.clntMplsLdpTraf) { logger.debug("session up"); } for (;;) { if (!working) { return; } mpLsp = fwdCor.mp2mpLsp.find(mpLsp); if (mpLsp == null) { return; } if (!mpLsp.local) { mpLsp.local = true; mpLsp.updateState(fwdCor); } bits.sleep(1000); } } private void clearState() { if (mpLsp != null) { fwdCor.mldpDel(mpLsp); } mpLsp = null; fwdCor = null; fwdTrg = null; } }