| Class | Description |
| Configurator | Dynamically updates the configuration of an OSPF session. |
| ConfigUpdateMessage | Protocol message used to send updates to OSPF. |
| Reset | Resets an OSPF session at a given time. |
| UnreliableIP | Simulates links going down at a given time. |
| IPwithErrorInjection | Introduces simple errors into packets. |
| PacketGenerator | Models specialized complex testers for paticular tests. |
| OSPFMonitor | Dumps OSPF packets in tcpdump format. |
| OSPFDumpPro | Converts dumps from binary tcpdump format to text format. |
| TOSDump | Converts binary tcpdump files including the TOS fields. |
| Logger | Helper class to write output into the SSFnet logfile. |
Looking closer at the UnreliableIP, IPwithErrorInjection and PacketGenerator classes, it becomes clear, that they all have to manipulate packets sent to or coming from an OSPF session. The simplest way to realize this in SSFnet is to put a ProtocolSession between IP and OSPF, which manipulates the packets accordingly, drops packets or sends new ones. In practice, putting the tester between OSPF and IP does not work. OSPF sends its packets directly to the protocol with name "ip". So, in order to manipulate packets coming from OSPF, the tester must be included in the protocol graph, using the name "ip". The IP session then has to use another name, e.g. "ip_original". The NIC class, which models the network interfaces also sends packets to the class with name "ip". If the tester uses this name, all packets are given directly to the tester. The IP session does not receive any packets at all.

Because of this, the tester must additionally provide the functionality of IP. This can be realized by inheriance. The tester classes can simply extend the \texttt{IP} class, adding new functionality where necessary. To be able to use the functionality of different kinds of testers at the same time (e.g. link failures together with malformed hello packets), more complex tester classes again extend the simpler ones. This leads to the class hierarchy depicted in Figure 5.

ProtocolSession [
name ip
use SSF.OS.OSPFv2.test.UnreliableIP
fail [
from 50.0
until 100.0
interface 0
]
]
Everytimes UnreliableIP receives a packet in its push method, it checks
if the current simulation time lies in a configured failure period. If this is true, the
interface associated with this packet is determined. If this associated interface corresponds
to the interface specified in the configuraton, the packet is dropped. Else, the packet is
passed on to IP's push method.
ProtocolSession [
name ip
use SSF.OS.OSPF.test.IPwithErrorInjection
error [
from 10.0
until 20.0
interface 0
netmask 255.255.0.0
]
error [
from 20.0
until 30.0
interface 0
bad_age 4000
]
error [
from 30.0
until 40.0
interface 0
dd_mtu 2000
]
fail [ ... ]
]
There are three kinds of errors, which can be introduced into OSPF packets at given times on
certain interfaces. The {\em netmask} error is used to change the netmask field of hello packets
to an arbitrary value. The MTU field of database description packets can be changed using the
dd_mtu error. To change the age of LSAs in link state update packets, the bad_age
error can be used. When a packet is sent to IPwithErrorInjection, it is first checked,
if the packet has to be manipulated. If yes, the packet is manipulated in the appropriate way.
After that, it is sent to UnreliableIP for further processing.
ProtocolSession [
name ip
use SSF.OS.OSPF.test.PacketGenerator
test[
interface 0
behavior
]
error[ ... ]
fail[ ... ]
]
Each test behavior is associated with an interface. The behavior of this interface is defined
by a name, which corresponds to the name of the test case (see the
IOL test suite description
for a list of test cases). Some test cases are subdivided into several independent test steps.
Test behaviors for these test steps carry the name of the test case followed by a number,
indicating the test step. Table 2 shows the test behaviors available in the
PacketGenerator class. These behaviors are described in detail in
the following Section.
| Test name | Test purpose / description |
| default | Normal OSPF behavior. |
| old_lsa_rcpt | Handling of the receipt of old LSAs (Test 2.6) |
| nbr_state_too_low | Correct handling of LSRequests from neighbors in a state < EXCHANGE (Test 2.7) |
| dd_retransmit14 | Retransmission of database description packets (Test 2.8) |
| event_seq_number_mismatch1-8 | Verify the generation of the SequenceNumberMismatch event (Test 2.9) |
| lsa_request_retransmit1-2 | Retransmission of LSRequest packets (Test 2.17) |
| event_bad_ls_req1-2 | Correct handling of the BadLSReq event (Test 2.18) |
| remove_lsa_from_retransmission_list | Removing LSAs from the retransmission list when they are discarded from the database (Test 2.21) |
| ls_sequence_number_wrap | Correct behavior when sequence number is wrapping (Test 3.22) |
ProtocolSession [
name configurator
use SSF.OS.OSPFv2.test.Configurator
update [
time 100.0
[...OSPF configuration...]
]
]
Each update has a time associated with it and contains an OSPF DML configuration. This
OSPF configuration may either be a complete configuration for all OSPF interfaces and areas
or a partial configuration for a subset of interfaces or parameters. The parameters of the
OSPF configuration which are not specified in the update remain unchanged.The Configurator adds each update to a list and starts a timer for each update, which fires at the specified time. Once the timer has fired, the update is removed from the list and the OSPF configuration is packaged into a ConfigUpdateMessage, which is derived from the ProtocolMessage class. This message is sent to the OSPF session by calling its push method. Support for the handling of ConfigUpdateMessages has been included in OSPF.
The class com.renesys.raceway.DML.dmlConfig provides an interface to the DML configuration. Each DML configuration represents a configuration tree -- configuration updates for OSPF are a subtree of the global DML configuration. When sending updates to the OSPF session, these subtrees have to be copied into the ConfigUpdateMessage. The dmlConfig class is supposed to provide a method to copy a DML subtree to another place. But this method seems not to work correctly and delivers unpredictable results. Therefore the configuration is copied entry by entry.
ProtocolSession [
name reset
use SSF.OS.OSPFv2.test.Reset
stop 10.0
start 20.0
stop 30.0
start 40.0
...
]