J-Sim Changes

patch1.3-4: 07/05/2006
- drcl.inet.socket.TCP_socket:
  - add resetAppSendClose() to notify of the event exactly once
- drcl.inet.socket.InetSocket: added _accept() and _aAcceptFinished() to be
  invoked by SocketMaster to avoid a race condition where TCP might start send
  stuff before SocketMaster associates socket with data port with
  htSockets.put(p, s); SocketMaster is modified accordingly
- drcl.inet.transport.TCP: implements getSeqNo() to return snd_nxt
- drcl.inet.transport.TCPSink: add getSeqNo() for subclass extension; in 
  addition, all TCP headers are added getSeqNo() upon creation
- drcl.inet.transport.TCPb:
  - implements getSeqNo() in TCPSink subclass, it returns TCPb.this.snd_nxt
  - dataArrivesAtDownPort(): invoke TCPSink.recv() when payload exists, not
    when seqno >= 0
- drcl.inet.socket.TCP_socket:
  - should check if the ACK is the expected one (ack no == seq no)
  - synchronized closeBottomHalf() to avoid a racing condition where FIN is
    sent out and ack comes back before the method goes to wait()
  - when reallyEstablished, should notifyAll() instead of just notify() as
    there may be more than one thread waiting
- drcl.net.graph.TopologyReaderAlt.parse(): Pattern.compile() needs to add 
  square parentheses just like regular expression; add code to deal with
  exceptions when not enough lines (for nodes or edges) are supplied
- drcl.inet.application.BulkSource: revised javadoc of setDataUnit(); it was
  misleading
- drcl.comp.Component.exposePort(...): use connectTo() instead of connect()
- fixed a bug in drcl.util.queue.VSFIFOQueue.dequeue(key) (Bjornar Libaek)
- make "info script" work for the first script specified on the command line:
  - drcl.ruv.Shell: removed "final" from evalFile()
  - tcl.lang.Hook: added setScriptFile() and addScriptFile()
  - drcl.ruv.ShellTcl: added evalFile() to set up for "info script" through Hook
- drcl.inet.application.FSPMessage: made it implement drcl.ObjectCloneable
  instead of extending drcl.DrclObj and added clone()
- add SetDefaultID
  - drcl.inet.contract.IDConfig: add new "SetDefault" message
  - drcl.inet.InetConstants: add new DEFAULT_IDENTITY_SET/UNSET event names
  - drcl.inet.core.Identity: revised to respond to new SetDefault message and
    to eject default identity set/unset events when appropriate
- drcl.comp.ARuntime.off(): the method was not synchronized! (Psoroulas Giannis)
- drcl.comp.queue.ActiveQueue.process(): handling of IntObj was not reachable
  (Louis Hugues)
- drcl.comp.tool.Plotter: added drawLine(); but this introduces conflict with
  previous output format where we assumed points are all connected;
  in addition, this cannot be invoked through ports yet
  (** TO BE FIXED **)
- drcl.inet.InetUtil.createTraffic()'s: remove the check for
  TrafficSourceComponent when calling setPacketWrapper(); NOT TESTED YET
- drcl.comp.ARuntime
  - _startAll(): add code at the end to deal with the situation where system
    is inactive and a new task is being added which triggers wakeupThread to
    handle the task; the original code did not change the system state to
    running
  - added more state information in wakeupThread
- drcl.inet.contract.DatagramContract.Message.wraps(): need to update pktsize
- drcl.inet.protocol.aodv.AODV:
  - added routePurgeEnabled to enable/disable route purge operation
  - modified not to have RT purge route again since AODV does it by itself
  - process(): added code to drop packet if the component has not started yet;
    this prevents AODV from going into wrong state before starting if nodes are
    booted up at different times
- added script/drcl/inet/wireless/mobility/ for testing mobility model
- drcl.inet.InetUtil:
  - added createNodes()'s with option of assigning node address
  - getPID(): added PID_AODV, PID_TRACE_RT
- drcl.inet.core.CSLBuilder.build(): set global queue properties only if q_
  is DEFAULT_QUEUE
- drcl.inet.data.InterfaceInfo: made it implement drcl.ObjectCloneable instead
  of extending drcl.DrclObj; included mtu,bw,bufferSize in clone()
- drcl.inet.core.CoreServiceLayer: added fillInterfaceInfo() to convey the
  information of MTU, interface bandwidth and buffer size to InterfaceInfo
  stored in hello
- drcl.inet.protocol.ospf.OSPF:
  - dataArriveAtDownPort(): added interface info in the error output
  - added refreshAll() to allow initiating a LSA refresh manually
- drcl.inet.protocol.ospf.OSPF_QoS:
  - fixed a bug in info() where a constant 14 was hard coded for array size;
    added info from super.info() as well
  - changed bw2metric() and metric2bw() to static for testing purpose
- drcl.inet.protocol.ospf.Router_LSA_Link: replaced tos_no, tos_list,
  tos_metric_list with tos_metric_map (HashMap)
- drcl.inet.core: moved link emulation out of NI and created NI_LinkEmulation
  - affected classes modified accordingly: CoreServiceLayer, CSLBuilder,
    QueueNI, ni/PointopointNI
- drcl.inet.InetUtil.createTopology(): modified to detect all (asymmetric
  connection) errors in adjMatrix_
- drcl.ruv.Dterm/DtermAWT,drcl.net.graph.TopologyVisRelaxer,drcl.comp.lib.Talk,
  drcl.comp.tool.Plotter/HistogramPlotter/ComponentTester: replaced show()
  with setVisible(true) for Window/JFrame
- drcl.comp.WorkerThread.getState(): renamed to _getState() due to conflict to
  java.lang.Thread.getState() added since v1.5.0
- drcl.inet: added InetPacketInterface and made InetPacket,
  drcl.inet.mac.LLPacket implement it
  - drcl.inet.core.queue.PriorityQueue: modified to use InetPacketInterface
    instead of InetPacket directly
- drcl.inet.core.Queue: javadoc revised (removed the wording saying that
  byte mode is the only acceptable mode)
- drcl.inet.core.queue.PriorityQueue/PreemptPriorityQueue:
  - removed drop_front option to reduce complexity; code revised accordingly
  - added instant queue length output
- drcl.inet.core.queue.PriorityQueue
  - fixed a bug in lastElement(), should decrement the loop variable
  - added info(String, boolean) for checking content in the queue
  - duplicate(): fixed a bug caused by null that_.qq; forgot to duplicate
    "capacity"
- drcl.data.RadixMap: fixed a bug in rn_insert() where mask list was not passed
  to parent node; bug appears when a leaf node with mask < -1 branches out
  on left and a longest match searches through the right branch and back tracks
  to the new parent node; example: add (0,8,0)(0,-8,0) and (0,13,0)(0,-1,0) and
  find longest match for (0,12,0);
  rn_delete_radix_mask() and rn_new_radix_mask() are modified accordingly
- drcl.inet.protocol.dv.DV._updateNeighbors(): added a special check for
  default route; default route can only be distributed within the same domain
- drcl.ruv.TclGateway: add code to start drcl.ruv.System if not yet done so;
  must do so to put Shell under ruv so that Shell is equipped with runtime;
  otherwise, Shell.print()-->Shell.doSending()-->NullPointerException
- drcl.ruv.Dterm.init(): add synchronization to avoid deadlock between
  new JFrame() and new JFileChooser()
- drcl.net.traffic.TrafficSourceComponent
  - send(): one of the two places to clone enclosingPacket was not revised
    accordingly when the code was revised to implement PacketWrapper
  - reset(): cancel timer if the timer exists
- drcl.net.traffic.tsPoisson: setPacketSize(), setRate() and set() added code
  to reschedule packets if the component already started
- drcl.ruv.drcl.tcl: have "grep" also use java.util.regex
05/14/2004 patch1.3-3
- drcl.comp.lib.bytestream.ByteStreamPeer: added sendWait(), recvWait(),
sendNotify() and recvNotify() for subclassing for non-simulation thread
- revised code for running real application in simulation threads
- drcl.inet.socket.Launcher:
- added static Thread newThread(Runnable)
- added MyRunnable and started application in MyRunnable in simulation
thread
- drcl.inet.socket.JSimSocketImpl: added MyByteStreamPeer to handle
non-simulation thread
- drcl.comp.Task: added a new field "threadGroup"
- drcl.comp.TaskSpecial: added a constructor to accept ThreadGroup as argument
- drcl.comp.TaskNotify: added a static MARK and assign this to every
instance's threadGroup; this way simulation thread's code of telling
special tasks becomes simple: just test if Task's threadGroup != null
- drcl.comp.ACARuntime: added a new addRunnableAt() to accept ThreadGroup as
argument
- drcl.comp.ARuntime:
- newThread() added ThreadGroup as argument
- added grabOne(ThreadGroup) and immediatelyStart(Task)
- drcl.comp.AWorkerThread: clean up run() and added code to handle task
whose threadGroup is not thread's
- drcl.sim.event.SESimulator:
- newThread() added ThreadGroup as argument
- added grabOne(ThreadGroup) and immediatelyStart(Task)
- drcl.sim.event.SEThread: clean up run() and added code to handle task
whose threadGroup is not thread's
- script/drcl/inet/socket/HelloServer.java:
use drcl.inet.socket.Launcher.newThread() instead of java.lang.Thread
- updated script/drcl/inet/dvmrp/test_igmp.trace and
script/drcl/inet/queue/*.trace
- drcl.inet.contract.DatagramContract
- add code to implement drcl.net.PacketWrapper and drcl.data.Countable
- drcl.inet.mac:
- NodePositionTracker, MobilityModel: added info()
- WirelessPhy: added setBandwidth() and more debug info to the case of
negative gap time
- NodeChannelContract, MacPhyContract: made Message implement
drcl.data.Countable so that raw bit rate can be collected by TrafficMonitor
- drcl.inet.protocol.dv.DV:
- _updateNeighbors(): relax the condition on checking route entry to be
distributed by DV
- _routingUpdateHandler(): make it more strict the condition on checking
route entry to be handled by DV (only those created by DV can be handled
by DV later)
- fix a bug in drcl.inet.transport.TCPSink.recv(): may receive a packet whose
seq_ is smaller than rcv_nxt but it contains new bytes due to retransmission
of several small messages in one segment and some of the messages have been
received before
- fix a bug in drcl.comp.lib.bytestream.ByteStreamPeer.handle():
pendingReceive.buffer may be null if caller specifies a null byte array to
receive
- Classes are revised to be compatible with J2SDK1.5
- drcl.comp.ARuntime
- drcl.comp.ForkManagerLocal
- drcl.comp.tool.ComponentTester
- drcl.comp.tool.HistogramPlotter
- drcl.comp.tool.Plotter
- drcl.inet.tool.routing_msp
- drcl.net.graph.ShortestPathTree
- drcl.net.traffic.tsCDSmooth
- drcl.sim.event.SESimulator
- drcl.intserv.Scheduler
- drcl.intserv.scheduler.admission_PTSP
- drcl.intserv.scheduler.admission_DCTS
- drcl.intserv.scheduler.scheduler_SP
- drcl.ruv.Dterm: added minimize() and restore()
- drcl.comp.tool.Plotter: added hide()/hideAll()
- drcl.net.traffic
- TrafficSourceComponent.info(): add birthTime printout
- tsPacketTrain.info(String): add prefix_ in printout
- drcl.inet.mac.WirelessPhy: added getEnergyModel()
- drcl.net.traffic.ts*: all TrafficSourceComponent's added reschedule()
to allow the parameters of a traffic source to be changed online and the
next packet (pakcet that has been scheduled) to be rescheduled accordingly
- drcl.data: added XYDataInterface; made XYData implement it
- drcl.comp.tool: made Plotter and PlotPlan deal with XYDataInterface

03/16/2004 patch1.3-2
- drcl.inet.NodeBuilder.loadmap(): add back code to deal with the option of
using default "up" port by specifying "-" as port ID in the node map
- drcl.comp.lib.bytestream:
- ByteStreamContract: added "STOP" command; also in ByteStreamConstants
- ByteStreamPeer:
- interrupt sending when STOP command is received
- added DONT_THROW_EXCEPTION
- enclose IO exception thrown in another IO exception as cause to better
locate where these exceptions occur.
- drcl.inet.transport.TCP:
- move state check from snd_packet() to timeout()
- according to RFC2988
- rtxcur_init: changed from 6.0 to 3.0
- smallest rto (in rxt_timer()): changed from 2*t_grain to 1.0 second
- added set/getMaxRetransmissionsAllowed(): when max is reached, TCP sends
a STOP command 0 or negative for unlimited retrans.
- drcl.ruv:
- Term: added set/getMaxNumberOfLines() for max # of lines that can be
buffered in the terminal; default is 500 lines
- Dterm: made conform to the maxNumberOfLines property

03/05/2004 patch1.3-1
- drcl.comp.lib.bytestream.ByteStreamPeer: added
getCurrentReceiveBufferOccupancy()
- drcl.inet.socket:
- added SocketListener to be notified of byte stream receiving events
- InetSocket: added registerListener()
- SocketMaster: added code for SocketListener callback
- drcl.inet.InetUtil:
- added connectNeighbors()
- added traceRoute/traceRouteInObj(Node, Node, long) to allow route tracing
to nodes with multiple addresses
- drcl.inet.NodeBuilder.loadmap(): allow application to be connected to
an arbitrary (non-number) up port of the transport
- drcl.comp.Port._getPeers(): should include ancestor ports
- drcl.inet.TraceRT:
- remove synchronized call and add code to output result through output@
port (asynchronously)
- bookkeep pending requests in order to calculate pkt traversal time
- drcl.inet.Node.traceRoute(): revised accordingly
- drcl.inet.TraceRTPkt: add incomingIf to addHop()
- drcl.inet.core.PktDispatcher:
- add incomingIf to TraceRTPkt
- for TraceRTPkt, use the destination field as the source when sending back
response instead of the default node address

02/20/2004 J-Sim v1.3 release
- drcl.inet.mac.RadioPropagationModel
- added "isCartesian"
- drcl.inet.mac.WirelessPhy modified accordingly

02/17/2004 J-Sim v1.3 beta-2
- drcl.comp.AWorkerThread.run(): fixed a bug that creates racing condition
after a thread cannot get more tasks from runtime but before it goes to
recycle(), another thread may produce new tasks (but no workforce is
available because the former thread is not recycled yet, the new tasks are
all put in ready queue) in the ready queue without the thread knowing it,
so when the former thread is recycled, the runtime stops with tasks in the
ready queue
solution: getTask() and recycle() need to be atomic
- drcl.comp.lib.bytestream.ByteStreamPeer: added exceptionThrownForSend/Receive
and interruptSend() as to interruptReceive() to interrupt blocked send()
and receive(); remove code that checks if currentThread is a workerThread
- updated drcl.Debug for the bug-reporting email address
- added drcl.data.XYData
- drcl.comp.tool.Plotter:
- add code to accept XYData (plot is fixed but dataset are dynamically added)
- plotID is obtained from the port group ID, dataset ID is created
automatically and is associated with XYData.getID()
- add setStepwise(int PlotID, boolean)
- drcl.comp.io.FileComponent: make use of drcl.util.StringUtil to print out
more complex data structures
- drcl.comp.ACARuntime:
- added SuspendHooks and RunHooks
- ARuntime and drcl.sim.event.SESimulator modified accordingly

02/05/2004 J-Sim v1.3 beta-1
- Integrated wireless and sensorsim extensions
- packages added: drcl.inet.mac, drcl.inet.sensorsim, drcl.inet.protocol.aodv
- PktDispatcher.setRouteBackFlag --> setRouteBackEnabled
- ObjectDuplicable --> ObjectCloneable for Message and drcl.net.Packet
- Integrated CBT package at drcl.inet.protocol.cbt
- added drcl.inet.application.McastTestApp
- added script/drcl/inet/cbt/cbt.tcl for testing
- drcl.inet.protocol.dv:
- DVPacket: removed "size"
- DV: added static int getDVPacketSize() to be used outside the dv package
- created script/drcl/inet/dv/DVFake.java and dvfake.tcl to test it
- drcl.net.graph:
- Link:
- make it unidirectional (associated with only cost);
it can be used as directional or un-directional link
- added "cost", "marked" and "directional"
- added new constructors
- ShortestPathTree: make "cost" part of result but need to get it with a
separate call getCost()
- move LinkCost to drcl.inet.tool.
- drcl.inet.InetUtil and drcl.inet.tool.routing_msp2 modified accordingly
- tested with script/drcl/inet/cbt/cbt.tcl
- drcl.net.graph: deal with parallel links between nodes
- Link: added interface index information
between nodes; new constructor for specifying interface indices
- added disconnect()
- LinkCost:
- removed the one using node indices only
- added cost(int, Link)
- Node: added linksInList(), better performance than links()
- added removeLink()
- ShortestPathTree: revised accordingly
- now the results of a run consist of three arrays: parent indices,
parent node interface indices and interface indices
- drcl.inet.InetUtil.setupRoutes() and drcl.inet.tool.routing_msp2 revised
accordingly
- tested with script/drcl/inet/cbt/cbt.tcl
- added CBT to the root Makefile
- update make/Makefile to Java 1.4 (including -source 1.4 option)
- add "$sim stop" in script/drcl/inet/queue/*.tcl for results to be repeatable
in different runs
- changed "ObjectDuplicable" to"ObjectCloneable" wherever it is appropriate:
- drcl.inet.Link
- drcl.comp.lib.Relay
- drcl.inet.transport.TCPPacket/UDPPacket
- drcl.inet.Link, drcl.comp.lib.Relay:
- revised to make sure the original copy of data_ is sent at the "last" port
- added drcl.comp.lib.SimpleReceiver: print whatever received to stdout
- tcl.lang: added RegexpCmdDrcl and RegsubDrcl which take advantage of
java.util.regex.
- RegexpCmd: modified init() to point the commands to the new classes above
- removed RegsubCmd, TclRegexp and the sublabs.brazil.util.regexp package
- Util.regExpMatch(): modified to use java.util.regex
- drcl.ruv.drcl.tcl: have "grep" also use java.util.regex
- drcl.inet.socket.TCP_full.info(): take advantage of drcl.inet.InetConfig.Addr
to beautify the print-out
- drcl.inet.socket.InetSocket.aCloseFinished(): remove the debug output
- drcl.inet.core.CoreServiceLayer.info(): sort out interface info according to
interface indices
- drcl.ruv.CommandTask.run(): should synchronized on shell to prevent the
result from deallocated in the interpreter
- drcl.inet.socket.InetSocket.aCloseFinished(): add code to disconnect dataPort
before remove it from the application component
- drcl.inet.socket.TCP_socket: make closing 3-bit flag, each indicating
application send close, application recv close and peer send close
so the TCP can react properly for both normal operation and error handling
- drcl.ruv.TclGateway: fixed the problem that it cannot be used without the
RUV system.
- fixed drcl.ruv.WaitUntil(Shell, String, Object) where no synchronized
before lock.wait()
- fixed '!!!' in drcl.tcl if the most specific class is not accessible
(not public)
- drcl.inet.socket
- TCP_full.reset(): should disconnect and remove UP group ports
- TCP_socket.dataArriveAtDownPort(): if closing and getSendingBuffer()
is empty AND packet is an ack (which just emptied the sending buffer)
then notify calling thread to send out FIN
- drcl.comp.Port: add correct trace print-out at places (shadow, send-receive)
- drcl.comp.Port:
- fixed doReceiving(): should consider InClients only
(the fix on 01/06/2004 on Util is not necessary)
- added getConceptualClients/ConceptualInClients/ConceptualOutClients
- clean up code and write comments
- added "stop components/classes" to drcl.comp.Util.exploreFlat(...)
- added "-stop" option to the "explore" RUV command
- drcl.ruv.Commands.explore(...) is modified accordingly
- added drcl.inet.InetConfig.Addr
- address scheme for Inet
- remove address association from drcl.net.Module and all subclasses
- beatifying printout from drcl.inet.CoreServiceLayer, involving
Identity, RT, InterfaceInfo and NetworkAddress
- make drcl.comp.Message implement ObjectCloneable instead of DrclObj
- related code changes on all subclasses
- drcl.ruv.SystemMonitor
- direct only error messages to stderr; otherwise to stdout
- drcl.inet.tool.routing_msp2/drcl.inet.InetUtil.setupRoutes()
- added new methods to allow input of arbitrary node addresses
- fixed a bug in drcl.ruv.ShellTcl.eval(BufferedReader):
should synchronize on the component when accessing the actual Interpreter
(had problem with IBM's SDK)
- drcl.inet.InetUtil.configureFlat(): revised the code of calculating mask
in the case of preserving node addresses; method comments are also revised;
tested with script/drcl/inet/inetutil1.tcl
- drcl.comp.Port: fixed getInClients() and getOutClients() where it should
get InClients from inwire.getInPorts() and OutClients from
outwire.getOutPorts()
- drcl.comp.Util.inject(): now injecting data to a shadow port sends the data
to all "in" clients of that port (it used to just sending data to the host
component of that port no matter if it is shadow or not)
- drcl.inet.core.queue.MQueue:
- added setClassifier()/getClassifier()
- fixed links between it and QueueLogics for setCapacity()
- added capacity overflow check at the beginning of enqueue()
- added drcl.diffserv.Classifiers for creating pkt classifiers to classify
AF packets
- added drcl.inet.tool.PktMonitor for tracking TCP pkt of specific seq#
- added drcl.diffserv.tool.DFFlowPktCounter for counting pkts in DF classes
- added script/drcl/diffserv/diffserv_ex5.tcl
- added drcl.inet.core.queue.PreemptPriorityQueue
- PriorityQueue does not preempt lower-priorty pkts when queue is full
- fixed a bug in drcl.inet.core.queue.PriorityQueue.enqueue()
where drop_front should dequeue from the queue of the level, not from
the overall queue
- added drcl.inet.InetUtil.traceRoute()/traceRouteInObj()
- added drcl.inet.TraceRTPkt/TraceRT: trace route pkt
- added drcl.inet.Node.traceRoute()/traceRouteInObj()
- drcl.inet.core.PktDispatcher modified to support TraceRTPkt
- drcl.inet.InetConstants: added ID_TRACE_RT and PID_TRACE_RT
- added drcl.xssdl package: XML Software System Description Language
- src/tcl/lang/library/init.tcl: saved in the "unix" format
- drcl.ruv.ShellTcl: remove DrclChannel, not used anymore (?); may be restored
for J-Sim to work in applet (e.g., puts)
- working on new CSLBuilder class (drcl.inet.core.CSLBuilder2)
(not finished yet)
- drcl.tcl: "pwd" now returns the path instead of printing out directly
- one can "grab" the result of "pwd"
- works in applet
- tcl.lang.ReflectException: put stackTrace in the result
- drcl.ruv.Dterm/RUVOutputManager/Shell/System:
tcl.lang.BlendExtension/FuncSig/JavaImportCmd/JavaInvoke:
- added check for SecurityException in order to work in applet
- drcl.inet.core.CoreServiceLayer: interface info printout added "physical
interfaces" to avoid confusion
- drcl.inet.core.PktDispatcher: added StackOverflowError check for detecting
routing self-looping on VIFs
- drcl.inet.core.CoreServiceLayer: setupVIFs(): add if to Hello when mtu<0
- integrated with Jacl v1.3
- improved FuncSig.matchSignature() for matching String to primitive types
(same improvement from v1.2.6)
- drcl.inet.protocol.dv.DV:
- added "interface set" so DV can work on only selected interfaces
- added "operation mode" so DV can work on either physical or virtual
(tunnel) ifs
- (interface set + virtual mode) is tested with script/drcl/inet/dv/dv3.tcl
- DVPacket: now implement drcl.ObjectCloneable only
- drcl.inet.Node: add addDefaultRoute() (for end host)
- drcl.inet.InetPacket:
- new constructor for 'nexthop'
- new toString() to include 'nexthop'
- drcl.inet.contract.PktSending:
- new getBcastPack() for 'nexthop'
- drcl.inet.Protocol:
- new broadcast() for 'nexthop'
- integrated with drcl.inet.mac.* and drcl.inet.protocol.aodv.* and
drcl.inet.sensorsim:
- comment out duplicate() from all Packet subclasses
- MobilityModel: change some fields to protected
- added drcl.ruv.TclAction for executing a Tcl script in response to a
received signal; tested with script/drcl/inet/tcp/test_ftp2.tcl
(in response to Marek Malowidzki's proposal)
- drcl.inet.application.ftp/ftpd: fixed reset() where super.reset() is not
called; add notify@ port to ftpd to notify of end of transfer.
- drcl.inet.transport.TCPb:
- fixed the bug at the receiving side where it does not use the same local
addr as the sending side
- added drcl.inet.TclComponent to allow developing simulation code in Tcl;
tested with script/drcl/inet/tclcomponent.tcl
- drcl.net.tool.TrafficMonitor*/drcl.comp.tool.CountMonitor*:
make output times align with window size (winSize) so it's not dependent on
arrival time of first data
- revised drcl.inet/inet2.html on how negative number can be used to specify
an adjacency matrix
- fixed drcl.inet.Link.attach(): separate two consecutive calls to
findAvailable() that caused the peer ports connected to the same port.
(reported by Amund Kvalbein)
- tcl.lang:
- fixed handling backslash-newline for DOS format where the char sequence is
\\\r\n, all codes now using backslash()
- added RegexpCmdDrcl and RegsubCmdDrcl based on java.util.regexp in JDK1.4
- RegexpCmd.init(): based on JDK version ("java.version") and
install appropriate command
- drcl.inet.NodeBuilder: format and polish build() using loops to deal with
same group of ports for clarity
- fixed drcl.inet.core.Identity.getIDs()
- drcl.ruv: take advantage again the stackTrace returned back from Tcl
because the actual exception is caught by Tcl but encapsulated in
TclException so the actual stack trace is only saved as Tcl result
(it.getResult())
- fixed a bug in PktDispatcher.broadcast()/forward() where InetPackets should
be cloned including extension (clone()) instead of just _clone()
- added "Stop Hook" to ACARuntime and subclasses
- drcl.ruv.WaitUntil added a constructor to install itself as "stop hook"
- fixed drcl.inet.core.ni.DropTailPointopointNI/drcl.inet.core.queue.DropTail
where not all queue size change events are reported
- added drcl.net.traffic.traffic_PoissonVariableSize/tsPoissonVariableSize
and tested with script/drcl/net/mm1.tcl, mg1.tcl
- added drcl.comp.tool.RunningAverage for getting average # of pkts in queue
- added "delay" to drcl.comp.lib.RNG for delaying outputs of each value
for simulation runtime
- Identity.getDefaultID(): just return defaultIdentity
defaultIdentity is set to NULL_ADDR initially
- modified drcl.inet.tool.routing_msp2 to have the option not installing
RT entries but returning the interfaces information
- added drcl.net.traffic.traffic_Poisson/tsPoisson and a testing script
traffic_poisson.tcl under script/
- fix problem in drcl.net.traffic.TrafficAssistant where the converting
class name for traffic component did not consider package name
- drcl.net.graph.Relaxer: added excludeStub()/includeStub() to not showing
stub nodes
- added AdjMatrixVis.visualize(int[][], boolean excludeStub) accordingly
- instead of fixing CSLBuilder (see 7/22/2003 bug), I fixed
drcl.inet.core.PktDispatcher.__createMTUs() where I avoided using
downPorts as reference; moreover, I added a commonMTU in fragmentPack
to fix the problem where PktDispatcher does not know the number of
interfaces it has (downPorts is not reliable)
- fixed drcl.inet.core.PktDispatcher._fragmentOutput(): it was a mess and
it didn't work (the test before did not reveal the problems...)
- fixed drcl.net.tool.TrafficMonitor2 and drcl.comp.tool.DataMonitor2
where they may output NaN for loss rate
- bug in drcl.inet.core.CSLBuilder: should assign MTUs to PktDispatcher
after all the down ports are created
- add drcl.util.MemoryMonitor (based on code from Java2d demo)
- memory leak in drcl.net.graph.ShortestPathTree?
turned out that it is (RTEntry + BitSet) that take a lot of memory
because the number is in the order of n^2 where n is # of nodes
- drcl.net.graph.LinkCost:
- added costIf(nodeID_, if_)
- change cost(int, int) to cost(long, long)
- drcl.net.graph.TopologyVisRelaxer: make "shake" a toggle button and
invoke large 'step'
- drcl.net.graph.Relaxer/TopologyVisRelaxer
- fine tune Relaxer and tested with CSL with up to 5 interfaces
- misc/visualization/csl*.brite
- enhanced TopologyVisRelaxer with "Stablize" and "Step"
- drcl.net.traffic: rewrite traffic source components for better random
number generation implementation
- tsParetoOnOff and tsExpOnOff are rewritten for precise modeling
(they used to be approximation for better performance)
- drcl.comp.tool.CountMonitor/CountMonitor2 are enhanced
- script/drcl/net/*.tcl are modified using CountMonitor
- add drcl.comp.tool.PlotPlain: similar to Plotter but writes data to files
in plain format (time, value)
- revised the "release" procedure in build.xml, the new one does pretty much
all the things automatically
- added drcl.comp.tool.TimerList for managing timeouts
- added drcl.inet.InetUtil.getAdjMatrixFromFile()
- modified drcl.ruv.System so that RUVOutputManager is not activated when
in uninteractive mode
- integrate topology generator code to j-sim:drcl.net.graph.*
- made drcl.net.graph.ShortestPathTree works with the package
- fixed drcl.comp.Component.removeAllComponents(): should call
removeComponent() to clean up things for each child component
- added drcl.ruv.WaitUntil so that main execution can be blocked until the
simulation is stopped
- drcl.ruv.System: add waitUntilStopped() to help running several simulations
in sequence
- for dynamic adding interfaces to a node:
- drcl.inet.core.PktDispatcher: add resetCache()
- drcl.inet.core.CSLBuilder: call pd.resetCache() after creating it
- drcl.inet.core.PktDispatcher: add ROUTE_BACK flag to allow pkt to be
forwarded back to the incoming interface, for wireless PktDispatcher
- drcl.inet.core.Hello: making staticMode effective in timeout() so that
Hello may go into static after simulation starts
- added drcl.net.graph.LinkCost to route setup API:
drcl.inet.tool.routing_msp2.setup(network_, adjMatrix, linkcost)
- added drcl.inet.InetUtil.setupRoutes(network, adjMatrix, linkcost)
to take advantage the new API
- Wire.split() now returns the new wire
- Port.disconnectPeers() now discard wire if no port is on it
- added drcl.net.graph (Node, ShortestPathTree, LinkCost)
- added drcl.inet.tool.routing_msp2 to take advantage of ShortestPathTree
to set up all unicast routes in one call
- added drcl.inet.InetUtil.setupRoutes(network, adjMatrix) to take advantage
of the new routine
- all is tested with script/drcl/inet/test_static.tcl
- ptolemy: fix Plot: comment out codes that repaint when add or remove points
this is problematic because it disables double buffering of swing
- drcl.inet.transport.TCPSink:
- problem? getAvailableReceivingBuffers() shouldn't count in fragments
- remove global "TS" and add aTS_ argument to ack_syn_fin()
- performance tuning in recv()
- use receivedSeq to update rcv_nxt
- drcl.diffserv.TrafficConditioner: added "addDefaultProfile" for adding
profile for BE traffic handling, especially for signaling/routing protocols'
packets

01/14/2004 patch1.2.1-10
- drcl.inet.socket.TCP_full: lock() causes deadlock for a loop-back request
- TCP_socket: added a PRE_LISTEN state, deal with it at ACCEPT and
SYN packet handling
- TCP_full: when setting up loop-back request and before entering
TCP_socket.dataArriveAtUpPort(), set TCP_socket's state to PRE_LISTEN
- drcl.inet.transport.TCP.info(): add code to deal with "state" out of
STATES's bound

11/20/2003 patch1.2.1-9
- drcl.inet.socket: complete the function of request queue
- SocketContract/SocketConstants: added LISTEN type and message construct
- InetSocket/SocketMaster: implemented listen()
- TCP_full:
- HalfTCPKey added "forBuffer"; mapHalfTCP shared by halfTCP and request
buffer
- added setRequestBuffer(...), getRequestBuffer() and related code to
add request to the buffer
- loop back queued request when accept command arrives
- rewrite dataArriveDownPort() to include processing of looped-back request
- use HashMap instead of Hashtable
- test script: script/drcl/inet/socket/sockettest4.tcl
- drcl.util.queue:
- added FiniteQueue, FiniteQueueImpl, FiniteFIFOQueue

10/16/2003 patch1.2.1-8
- drcl.net.graph.*:
- added readers for topologies in the Brite and ALT formats.
- drcl.inet.InetUtil: added getAdjMatrixFromFile(String) to get adjMatrix
from a topology file. (7/7/2003)

8/26/2003 patch1.2.1-7
- drcl.ruv:
- added TclGateway to access RUV with Tcl commands in other shell environment
such as ShellPython
- added WaitUntil(Shell, String) and modified wait_until in drcl.tcl
to use that, now wait_until has no restriction on whether it is executed
in nested commands
- modified Shell.eval() and alike so that they return Object
instead of String as results
- exception handling is rewrote with ShellEvalException; make Shell throw
appropriate exception when parsing/evaluation error occurs
- added StackTraceFilter (Shell implements) to make stack trace print-out
more compact and relevant
- drcl.inet.InetUtil._setupInterfaceInfo()
- modified to use Port.getAncestors() instead of getPeers()
- also includes all previous patches

8/11/2003 patch1.2.1-6
- added drcl.data.NumberObj; modified IntObj, LongObj and DoubleObj
- added drcl.comp.tool.Countable,RunningAverage for calculating running avg;
- removed default Random in drcl.net.traffic.TrafficSourceComponent and
added setSeed(seed) in reset(); subclasses are modified accordingly including
tsExpOnOff, tsFixedPoints, tsParetoOnOff, tsPeakRate
- fixed a bug in TrafficAssistant where it didn't include package name when
looking for matching traffic source component
- fixed a bug in drcl.inet.core.ni.DropTailPointopointNI where some queue length
events were not reported through .q@ port
- added script/drcl/net/mm1.tcl, an example of M/M/1 queue

7/10/2003 patch1.2.1-5-updated
(The changes below enhance the APIs for getting port/connection information)
- added drcl.comp.Component.isDirectlyRelatedTo(Component)
- drcl.comp.Port:
- extending the definition of a shadow port to any "ancestor" component;
use it to check shadow connection
- several methods are revised: getPeers(), getInPeers(), getOutPeers(),
getShadows(), getInShadows(), getOutShadows()
- added getConceptualInPeers()
- added getAncestors(), getInAncestors(), getOutAncestors()
- drcl.comp.Wire: added getRealPorts(), getRealInPorts(), getRealOutPorts(),
getShadowPorts(), getShadowInPorts(), getShadowOutPorts(),
getRealPortsExcept(), getShadowPortsExcept()

7/8/2003 patch1.2.1-5
- fix a bug in drcl.comp.Component._duplicateIn() and _duplicateOut()
where pclone_'s wires should be disconnected first in case wires exist before
the duplicate operation.
- fix a bug in drcl.comp.Wire._removeInAll() and _removeOutAll() that stops
from processing along the port linked list.

6/2/2003 patch1.2.1-applet
- fix drcl.ruv.* and tcl.lang.* to make JavaSim run in applets
(this fix has little effect when running J-Sim as application but
is considered "experimental" when running as applet as we have not tested
it extensively in the applet environment)

4/30/2003 patch1.2.1-4
- fix a bug in drcl.inet.protocol.ospf.OSPF which prevents neighbor state
transitioned from loading to full.

4/25/2003
- release jacl source at the "patch" section

2/14/2003 patch1.2.1-3
- fix a bug in drcl.sim.event.SEThread.lock() which may cause
NullPointerException when Component.lock() is invoked
- fix a bug in drcl.inet.transport.TCPSink which fails TCP connection when
the receiving buffer is overflowed at the arrival of last outstanding segment
- if receiving buffer overflowed, ack with AWND=0 is sent back. but if
that was the last outstanding segment, then sender does not know when
the receiver will reopen AWND again...
- fix: need to send ack when AWND back from zero
- add drcl.util.scalar.LongSpace.getLongInterval(int)
- add drcl.util.scalar.IntSpace.getIntInterval(int)

1/13/2003 patch1.2.1-2
- fix a bug in drcl.inet.core.PktDispatcher's VIF checking

1/8/2003 patch1.2.1-1
- fix some minor cases where a disabled components still receives.

12/12/2002 J-Sim v1.2.1
- drcl.comp.Component: fixed setDebugEnabledAt() for possible integer overflow
- drcl.comp.tool.Plotter: fix for throwing exception when getting a plot
(getPlot()) that does not exist yet
- drcl.inet.InetUtil: fixed javadoc errors
- drcl.inet.Protocol: fix the debug printout in routeQueryHandler()
- drcl.inet.core.QueueNI: javadoc
- drcl.inet.core.queue.PriorityQueue:
- improved output of info()
- added getQueue() for accessing subqueue
- drcl.inet.protocol.dvmrp.DVMRP: fix the problem where a sender and a receiver
connects to the same router and if the receiver joins first, the packets
from the sender wouldn't be flooded to the network
- drcl.inet.socket: fix a bug where a socket-close sent from application
immediately follows data transmission, the 'close' command closes the socket
right away with outstanding segments; a new 'establish' msg is introduced to
SocketContract and several classes are involved: SocketContract,
SocketConstants, InetSocket, JavaSimSocketImpl, SocketMaster and TCP_Socket.
- drcl.inet.TCP/TCPSink: fix bugs in setMSS()
- drcl.net.Address: improved printout format of multicast addresses
- added drcl.inet.application.FileSource for finite bulk transfer

10/2002 J-Sim v1.2
- added "ant" build file, see "build.xml".
- drcl.sim.event is completed
- drcl.comp:
- rewrote Wire and related classes for better performance
- code tuning: avoid calling Thread.currentThread()
- ACARuntime: added newTasks()
- drcl.comp.Util:
- rewrote getLinks() for better performance
- added exploreFlat() and explore(targets)
- drcl.ruv.CommandOption: added "flat" option for the "explore" command
- drcl.ruv.Commands: added code to "explore" to use exploreFlat() and
explore(targets)
- operate(): take advantage of ACARuntime.newTasks()
- drcl.comp.tool.Plotter: added set/getRedrawProbability()
- AWorkerThread.unlock(): fix the bug where it may notify a "waiting" thread
instead of threads that are waiting for the lock
- Port.set(group, id) did not take into account "removable"; if the port is
not removable then the port will end up in two groups
- drcl.inet:
- added drcl.inet.protocol.ospf.QoS_OSPF: QoS extension to OSPF
- InetUtil:
- added setupRoute() and setupBRoute() for setting up routes between
neighboring nodes.
- configureFlat(): added "reassingNodeID" flag to force InetUtil not to
reassign node ID
- drcl.inet.socket:
- rename: JavaSimSocket to JavaSimSocketImpl
- JavaSimSocketImpl: made compilable with JDK1.4 but not with 1.3 anymore
- added code to close socket asynchronously
- added nonblocking API (accept, connect, close)
- classes added: InetSocket, SocketApplication, NonblockingSocketHandler,
SocketMaster
- TCP_socket:
- "connecting" should be off when receiving a FIN or a CLOSE
- TCP_full:
- did not handle simultaneous SYNs correctly
- drcl.inet.core:
- merged PktDispatcher, RT and Identity; now PktDispatcher directly invokes
RT and Identity
- added QueueNI and core.ni.DropTailPointopointNI and make this the default
queue and ni component when building a CSL
- fixed PktDispatcher.broadcast(): pp_[i] does not correspond to "i@down"
- added core.queue.PriorityQueue
- drcl.inet.Node: add link emulation interface
- rewrote drcl.inet.tool.routing_mspf.setup() for better performance and
to be able to set up routes between nodes that are not in the same
network container.
- drcl.inet.transport
- TCP:
- CWND, MAXCWND: changed from double to int
- avoid sending fragment packets (pkts with size < MSS)
- use last_seq to identify significant/effective acks
- check if sending fragment is necessary
- increase sbuffer to AWND+MSS to prevent sending fragments when CWND
reaches the limit
- fix minors in reset()/resetRXTTimer()
- TCPSink:
- fix rbuffer handling when size < MSS and got retransmitted in full MSS
- drcl.inet.application.SUDPApplication implemnets timeout() instead of
processing fork event in processOther()
- drcl.inet.contract.RTLookup: add a new message format which allows
InetPacket and incoming interface being passed to routing protocol when
route entry is not found for the packet
- drcl.net:
- Packet: added explicit query API for different supports:
isPacketCountSupported(), isByteCountSupported() and isTimeStampSupported()
- implementation: if the packet body is another packet, the query is passed
to the encapsulated packet
- drcl.net.traffic:
- added TimestampedFooPacket
- TrafficSourceComponent: added a timestamp flag; if enabled,
TimestampedFooPackets are generated instead of just FooPackets
- TrafficAssistent is enhanced at exception handling
- drcl.net.tool:
- added Countable
- TrafficMonitor classes now take Countable as inputs so it can handle
anything that implements this interface; drcl.net.Packet is made to
implement it
- Address is modified to print out address in decimal, dotted-decimal or hex
according to the value; drcl.inet.InetPacket is modified to take advantage
of this
- drcl.util.StringUtil: added hexToLong(), toDottedDecimal() and
dottedDecimalToLong()
- drcl.ruv:
- drcl.ruv.CommandOption: mixed up with "-s" and "-d"
- ShellTcl can now get a more precise exception message from
tcl.lang.Reflection (stack trace being added in the result as well)
- tcl.lang.ReflectObject.findInReflectTable()/addToReflectTable()/
removeFromReflectTable() where they use hashCode() attempting to generate
unique numbers for objects which is not true.
- drcl.tcl: __rt_common_: cast rt_ to most specific class
- drcl.data.BitSet:
- rewrote nbset()/getSetBitIndices()/getUnsetBitIndices for better performance
- fix set(): call setSize() instead of enlarge()
- drcl.util.queue is re-organized:
- expand Queue (class) to Queue, VariableSizeQueue, FiniteVSQueue (interface)
and their base implementations (QueueImpl, VariableSizeQueueImpl and
FiniteVSQueueImpl); subclasses are created/modified accordingly
- other bug fixes:
- drcl.util.queue.TreeMapQueue: reset()
- drcl.util.scalar.IntSpace/LongSpace.checkoutGreater()/checkoutSmaller()
- drcl.diffserv.HQS: it calls pickEligibleQueue in both firstElement()
and dequeue() but firstElement() should not alter the internal states as
for dequeue(); fix: passing a flag to pickEligibleQueue to indicate
whether it is a dequeue() or not
- drcl.comp.lib.bytestream.ByteStreamPeer.inputStream.read(): argument could
be null
- drcl.data.Map.createMapKey(): should use set() instead of xor() to make
the bits all 1's
- fixes due to JDK implementation changes from 1.3 to 1.4:
- drcl.inet.socket.SocketImpl.bind(): bind() is called for server sockets
only in 1.3 but for both server and client sockets in 1.4
- drcl.comp.lib.bytestream.ByteStreamPeer: input stream implementation

10/19/2001 J-Sim v1.0 (formerly known as JavaSim)
- drcl.comp is re-worked for better performance:
- The timer API in Component is revised (fork()/forkAt()/send()/sendAt())
all affected components are revised
- now drcl.ruv.System accepts script arguments
- drcl.inet:
- add InetUtil.configureFlat() and more createTrafficSource() methods
- drcl.net:
- traffic.TrafficComponent: make downPort OUT type
- traffic.TrafficShaperComponent: make upPort IN type
- tool.TrafficMonitor*: now recognizes
drcl.comp.contract.GarbageContract.Message.
- integrate with Python:
- upgraded to jython2.1a3
- drcl.ruv.Commands: add more toRef() methods and mkdir() methods
to facilitate building scenarios in Python
- experimental:
- add switching and label switching capability to drcl.inet.core.PktDispatcher
- drcl.sim.event: sequential discrete event simulation engine
- bug fixes:
- drcl.inet.socket.TCP_full
- drcl.ruv.ShellPython
- drcl.inet.protocol.ospf.OSPF
- drcl.inet.application.fspd

8/3/2001 Pre-release8
- adopts BSD-like license
- integrated Jython2.0, added drcl.ruv.ShellPython.
- added package drcl.inet.socket for running real applications on JavaSim
(preliminary), also drcl.inet.transport.TCPb
- added drcl.inet.core.sIGMP for hosts doing multicasting (experimental)
- revised affected classes and scripts
- revised drcl.inet.NodeBuilder so that multiple instances of a protocol class
can exist in a node with different protocol IDs
- revised drcl.diffserv
- added callback drcl.net.Module.timeout(Object)
- added drcl.comp.Handler, made WrapperComponent a Handler
- drcl.comp.Port.sendReceive() now can be called in a non-workerthread thread,
(this is however deadlock prone)
- rewrote drcl.comp.ForkManagerDefault/ForkManagerLocal to adapt to low system
time resolution
- added New-Reno to drcl.inet.transport.TCP, Vegas and SACK were rewritten
- bug fixes:
- drcl.comp.Component.send()
- drcl.inet.core.PktDispatcher: shouldn't loop back when router alert is set
- drcl.inet.protocol.dvmrp.DVMRP: didn't graft the "group" entry in
mcastHostJoinHandler()
- drcl.inet.core.ni.PointopointNI: was too time-sensitive, couldn't run in
real time
- deadlock between drcl.ruv.CommandTask and drcl.comp.WorkerManager
- drcl.comp.WorkerManager
- reset() in case a WorkerThread is the one resetting
- systemBecomesInactive: set state to INACTIVE only when RUNNING
- drcl.comp.Port.duplicate(): copy only flags
- other classes revised:
- drcl.util.scalar.LongSpace/IntSpace
- drcl.net.traffic.TraceInput: TCPTrace --> SimpleTrace
- drcl.inet.transport.UDP

7/3/2001 Pre-release7
- rewrote runtime to avoid thread synchronization for better performance
(performance improved up to 5 times)
- drcl.comp.Component: added delay send APIs, send() and sendAt()
- remove "block" semantics from drcl.comp.lib.bytestream.ByteStreamContract to
allow implementing nonblock bytestream components:
drcl.inet.application.BulkSource/BulkSink
- rewrote all the contract classes (got rid of Struct)
- drcl.inet.NodeBuilder: added "node map" to control building a node;
added loadmap() and more build() methods to include the "map" argument
- test scripts are all revised to take advantage of "node map"
- ruv output subsystem is re-organized
- drcl.ruv.Term: added setTerminalOutputEnabled()
- drcl.ruv.System: added "-n" option
- other classes revised:
- drcl.net.tool.NamTrace
- drcl.net.traffic.tsTokenBucket
- drcl.net.Address
- drcl.inet.InetUtil: added setNamTraceOn()
- drcl.inet.core.NI/ni.PointopointNI
- drcl.comp.Port
- drcl.comp.io.Stdout/FileComponent
- drcl.ruv.Dterm

6/4/2001 Pre-release5/6 (Internal releases)
- added drcl.net.tool.NamTrace, drcl.inet.tool.NamTrace
- rewrote contract classes, packages affected:drcl.comp, drcl.comp.queue,
drcl.comp.lib.bytestream, drcl.inet (and subpackages), drcl.ruv.
- rewrote drcl.net.Packet, removed drcl.net.PacketHeader/PacketBody
affected packages: drcl.net, drcl.inet (and subpackages)
- changes in drcl.comp:
- Trace can now be controlled port-wise
- add drcl.comp.contract.DoubleEventContract
- changes in drcl.net:
- added FooPacket
- added traffic.traffic_OnOff and traffic.tsOnOff
- several traffic classes are tuned up for better performance
- changes in drcl.inet:
- added InetConstants and core.InetConstants for better constant control
- changes in protocol.ospf: more bugs fixed
- changes in CoreServiceLayer, core: removed port grouping
to save space
- transport.TCP/TCPSink:
- bugs fixed
- added NS_COMPATIBLE flag for RENO
- added drcl.intserv (not incorporated in yet)
- changes in drcl.ruv:
- Dterm in previous releases is renamed as DtermAWT, now Dterm is
javax.swing.JFrame
- more bugs fixed
- "setflag": added trace control with "-at", added "-only" for debug flag
- miscellaneous changes
- drcl.comp.tool.Plotter
- drcl.comp.io.FileComponent: add timestamp option

4/29/2001 Pre-release4.2
- Re-organize the directories and incorporate "GNU-Make" makefiles to
facilitate compiling the sources.
- More bugs are fixed.
- drcl.inet.protocol.ospf.* are revised.
- RUV system commands are enhanced for better usability.