package org.freertr.serv; import java.util.List; import org.freertr.addr.addrIP; import org.freertr.cfg.cfgAll; import org.freertr.cfg.cfgIfc; import org.freertr.ip.ipFwd; import org.freertr.ip.ipFwdIface; import org.freertr.ip.ipPrt; import org.freertr.pack.packHolder; import org.freertr.pipe.pipeSide; import org.freertr.prt.prtGenConn; import org.freertr.prt.prtMplsIp; import org.freertr.tab.tabGen; import org.freertr.tab.tabRouteIface; import org.freertr.user.userFilter; import org.freertr.user.userFormat; import org.freertr.user.userHelping; import org.freertr.util.bits; import org.freertr.util.cmds; import org.freertr.util.counter; import org.freertr.util.state; /** * mpls in ip (rfc4023) server * * @author matecsaba */ public class servMplsIp extends servGeneric implements ipPrt { /** * create instance */ public servMplsIp() { } /** * interface to use */ public cfgIfc tempIfc; /** * sending ttl value, -1 means maps out */ public int sendingTTL = 255; /** * sending tos value, -1 means maps out */ public int sendingTOS = -1; /** * sending df value, -1 means maps out */ public int sendingDFN = -1; /** * sending flow value, -1 means maps out */ public int sendingFLW = -1; /** * list of connections */ public tabGen conns = new tabGen(); /** * timeout */ public int timeout = 60000; /** * counter */ public counter cntr; /** * defaults text */ public final static String[] defaultL = { "server mplsip .*!" + cmds.tabulator + "port " + prtMplsIp.prot, "server mplsip .*!" + cmds.tabulator + "protocol " + proto2string(protoAllDgrm), "server mplsip .*!" + cmds.tabulator + "timeout 60000" }; /** * defaults filter */ public static tabGen defaultF; public tabGen srvDefFlt() { return defaultF; } public void srvShRun(String beg, List l, int filter) { if (tempIfc == null) { l.add(beg + "no clone"); } else { l.add(beg + "clone " + tempIfc.name); } l.add(beg + "timeout " + timeout); } public boolean srvCfgStr(cmds cmd) { String s = cmd.word(); if (s.equals("timeout")) { timeout = bits.str2num(cmd.word()); return false; } if (s.equals("clone")) { tempIfc = cfgAll.ifcFind(cmd.word(), 0); if (tempIfc == null) { cmd.error("no such interface"); return false; } if (tempIfc.type != tabRouteIface.ifaceType.template) { cmd.error("not template interface"); tempIfc = null; return false; } return false; } if (!s.equals(cmds.negated)) { return true; } s = cmd.word(); if (s.equals("clone")) { tempIfc = null; return false; } return true; } public void srvHelp(userHelping l) { l.add(null, "1 2 clone set interface to clone"); l.add(null, "2 . name of interface"); l.add(null, "1 2 timeout timeout of client"); l.add(null, "2 . milliseconds"); } public String srvName() { return "mplsip"; } public int srvPort() { return prtMplsIp.prot; } public int srvProto() { return protoAllDgrm; } public boolean srvInit() { return genRawStart(this, 0); } public boolean srvDeinit() { return genRawStop(this, 0); } public boolean srvAccept(pipeSide pipe, prtGenConn id) { return true; } /** * get protocol number * * @return number */ public int getProtoNum() { return prtMplsIp.prot; } public String toString() { return "mplsip"; } /** * close interface * * @param iface interface */ public void closeUp(ipFwdIface iface) { } /** * set state * * @param iface interface * @param stat state */ public void setState(ipFwdIface iface, state.states stat) { } /** * received packet * * @param rxIfc interface * @param pck packet */ public void recvPack(ipFwdIface rxIfc, packHolder pck) { servMplsIpConn ntry = new servMplsIpConn(rxIfc, pck.IPsrc, this); servMplsIpConn old = conns.add(ntry); if (old != null) { old.doRecv(pck); return; } if (tempIfc == null) { return; } ntry.doStartup(); ntry.doRecv(pck); } /** * alert packet * * @param rxIfc interface * @param pck packet * @return false on success, true on error */ public boolean alertPack(ipFwdIface rxIfc, packHolder pck) { return true; } /** * error packet * * @param err error code * @param rtr address * @param rxIfc interface * @param pck packet */ public void errorPack(counter.reasons err, addrIP rtr, ipFwdIface rxIfc, packHolder pck) { } /** * get counter * * @return counter */ public counter getCounter() { return cntr; } /** * get show * * @return result */ public userFormat getShow() { userFormat res = new userFormat("|", "addr|iface|for|since"); for (int i = 0; i < conns.size(); i++) { servMplsIpConn ntry = conns.get(i); if (ntry == null) { continue; } res.add(ntry.peer + "|" + ntry.acesIfc.name + "|" + bits.timePast(ntry.created) + "|" + bits.time2str(cfgAll.timeZoneName, ntry.created + cfgAll.timeServerOffset, 3)); } return res; } } class servMplsIpConn implements Runnable, Comparable { public servMplsIp lower; public ipFwd fwdCor; public ipFwdIface iface; public addrIP peer; public cfgIfc acesIfc; public prtMplsIp worker; public boolean seenPack; public long created; public servMplsIpConn(ipFwdIface ifc, addrIP adr, servMplsIp parent) { iface = ifc; peer = adr.copyBytes(); lower = parent; fwdCor = lower.srvVrf.getFwd(peer); worker = new prtMplsIp(fwdCor); } public String toString() { return "mplsip with " + peer; } public int compareTo(servMplsIpConn o) { int i = iface.compareTo(o.iface); if (i != 0) { return i; } return peer.compareTo(o.peer); } public void doStartup() { worker.setEndpoints(iface, peer, false); worker.sendingFLW = lower.sendingFLW; worker.sendingTOS = lower.sendingTOS; worker.sendingTTL = lower.sendingTTL; worker.sendingDFN = lower.sendingDFN; acesIfc = lower.tempIfc.cloneStart(worker); worker.setUpper(acesIfc.ethtyp); acesIfc.ethtyp.setState(state.states.up); created = bits.getTime(); new Thread(this).start(); } public void doRecv(packHolder pck) { seenPack = true; worker.recvPack(iface, pck); } public void run() { if (lower.srvCheckAcceptIp(iface, peer, worker)) { return; } for (;;) { bits.sleep(lower.timeout); if (!seenPack) { break; } seenPack = false; } acesIfc.cloneStop(); worker.closeDn(); lower.conns.del(this); } }