As per Relevance of the word resolution, we have this rfc below:











Network Working Group P.
Request for Comments: 1329 May 1992


Thoughts on Address Resolution for Dual MAC FDDI

Status of this

This memo provides information for the Internet community. It
not specify an Internet standard. Distribution of this memo
unlimited

1.

In this document an idea is submitted how IP and ARP can be used
inhomogeneous FDDI networks (FDDI networks with single MAC and
MAC stations) by introducing a new protocol layer in the
suite of the dual MAC stations. Thus two dual MAC stations are
to do a load splitting across the two rings and use the
bandwidth of 200 Mbits/s as single MAC stations. The new layer is
extension of layer 3. For the user, the higher layer protocols,
and ARP the property "dual MAC" is transparent. No modification
required in the protocol suite of single MAC stations and
bridges

2.

This paper is a result of a diploma thesis prepared at the
University of Munich, Lehrstuhl fuer Kommunikationsnetze, in co
operation with the Siemens Nixdorf AG. The author would like
thank Jrg Eberspher and Bernhard Edmaier from the university,
Thimmel and Jens Horstmeier from the SNI AG at Augsburg for
helpful comments and discussions

3.

Primary MAC, P-MAC MAC, placed on the primary
Secondary MAC, S-MAC MAC, placed on the secondary
Inhomogeneous ring configuration of a dual FDDI ring
single MAC and dual MAC

DMARP Dual MAC Address Resolution

4.

When a dual FDDI ring wraps, both MACs in a dual MAC station
assumed to remain connected to the ring. ANSI is just
whether the Configuration Management in the Station Management of



Kuehn [Page 1]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


FDDI station can be modified to allow this. According to the
SMT standard [1], different addresses are required for all MACs
the primary and the secondary ring

In this paper, the MAC in a single MAC station is assumed to
on the primary ring. The application of single MAC stations
have their MAC attached to the secondary ring is not precluded,
therefor additional connectivity between the two rings is required
These configurations are beyond the scope of this document

5. The Application of Transparent

Transparent bridges can provide links to other 802 LANs or
inhomogeneous FDDI rings. The connection between two
FDDI rings can be realized by one or two transparent bridges.
two transparent bridges are used, one transparent bridge links
primary rings, the other the secondary rings. If two secondary
are connected by a transparent bridge, a path of transparent
must exist between the two primary rings. No transparent bridges
allowed between the primary and the secondary ring

6. Protocol Layers in Single MAC

The new protocol layer, named load sharing layer, is drafted to
introduced only in dual MAC stations. In single MAC stations, IP
ARP are working on top of the Subnetwork Access Protocol (SNAP) 04]
and the Logical Link Control protocol (802.2 LLC) [3]. LLC type 1
used because connectionless services are investigated only























Kuehn [Page 2]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


+--------------------------+
| IP |
+--------------------------+
+--------------------------+
| ARP |
+--------------------------+
| |
| ARP frames | IP
| |
+--------------------------+
| SNAP |
+--------------------------+
+--------------------------+
| LLC |
+--------------------------+
+--------------------------++-------+
| FDDI-MAC || F |
+--------------------------+| D S |
+--------------------------+| D M |
| FDDI PHY and PMD || I T |
+--------------------------++-------+

For the ARP layer, the following model is assumed
+-------------------------------------------------------X-----------+
| - ARP entity - | |
| | IP frames |
| +----------------+ +----------------+ read | |
| | Cache | | | entries +-------------+ |
| | Administration |->-| Address Cache |------>--| Address | |
| +----------------+ | | | Conversion | |
| | +----------------+ | Unit | |
| | ARP frames +-------------+ |
| | / | |
| | ___________ <- ARP requests _________________/ | IP frames |
| |/ | |
+-----X-------------------------------------------------X-----------+

The Address Conversion Unit handles the actual conversion of
addresses to hardware addresses. For this purpose, it uses
information in the ARP cache. The cache administration
with other ARP entities by ARP and creates, deletes and renews
entries in the cache

7. Protocol Layers in Dual MAC

The load sharing layer provides the same interface to ARP as
does. To exchange information about addresses and reachability,
load sharing entities in dual MAC stations communicate with the



Kuehn [Page 3]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


MAC Address Resolution Protocol (DMARP). For the transmission
DMARP frames the SNAP SAP of LLC is used, as for IP and ARP, too
The Organizationally Unique Identifier (OUI) in the SNAP header
set to zero (24 bit), the EtherType field (16 bit) contains a
number indicating DMARP, which is not defined yet

+---------------------------------------------------------+
| IP |
+---------------------------------------------------------+
+---------------------------------------------------------+
| ARP |
+---------------------------------------------------------+
| ARP frames | IP
+---------------------------------------------------------+
| Load Sharing Layer |
+---------------------------------------------------------+
| | | | | |
| ARP | DMARP | IP | ARP | DMARP |
| frames | frames | frames | frames | frames |
| | | | | |
+-------------------------+ +----------------------------+
| SNAP 1 | | SNAP 2 |
+-------------------------+ +----------------------------+
+-------------------------+ +----------------------------+
| LLC 1 | | LLC 2 |
+-------------------------+ +----------------------------+
+-------------------------+ +----------------------------++-------+
| Primary MAC | | Secondary MAC || F |
+-------------------------+ +----------------------------+| D S |
+---------------------------------------------------------+| D M |
| FDDI PHY and PMD || I T |
+---------------------------------------------------------++-------+

8. Running Inhomogeneous FDDI

8.1. Exchange of Primary MAC Addresses between

IP and higher layer protocols only use the network independent
addresses. The ARP entity takes upon the conversion of an IP
to the appropriate hardware address. To make the property dual MAC
transparent, ARP may only know the addresses of MACs on the
ring. Therefore, the load sharing entity always delivers ARP
to SNAP 1 for transmission. By this way, communication with ARP
done over the primary ring in normal state. A secondary MAC
receive an ARP frame when the dual ring is wrapped and
destination hardware address is a multicast or broadcast address
These frames will be discarded because they were received twice




Kuehn [Page 4]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


By this way, the associations of IP addresses to primary
addresses for the single MAC and dual MAC stations are stored in
ARP cache. The ARP cache contains no secondary MAC addresses

8.2. Exchange of Secondary MAC Addresses between Dual MAC

The load sharing layer needs to know the secondary MAC addresses
the other dual MAC stations. The DMARP is used to get
addresses. Whenever the load sharing entity delivers an ARP frame
SNAP 1, a DMARP reply frame will be sent on the secondary ring
containing the stations primary and secondary MAC address.
destination hardware address in this DMARP frame is the broadcast
address, the EtherType field in the SNAP header identifies DMARP
The IP destination address is copied from the ARP frame. If the
frame that was transmitted parallel to the DMARP reply was a request
an ARP reply frame will be sent back to the sending station by
ARP entity in the receiving station. When the load sharing layer
the receiving station delivers this ARP reply frame to SNAP 1,
sends a DMARP reply frame on the secondary ring

By this way, DMARP exchanges the additionally required secondary
addresses between the dual MAC stations. This is done parallel
the exchange of the ARP frames

8.3. Communication of Dual MAC Stations on Different Dual FDDI

If two inhomogeneous dual FDDI rings are connected by one
bridge, dual MAC stations placed on different dual FDDI rings
perform a load sharing. If both dual FDDI rings remain in
state, no DMARP reply frames get from one secondary ring to the
secondary ring. A dual MAC station realizes another dual MAC
placed on the other dual ring as a single MAC station, because
only receives ARP frames from it. If one of the dual rings
wrapped, a DMARP reply frame can get on the primary ring of the
dual ring. A target station on the unwrapped ring receives
DMARP frame by the primary MAC and the load sharing entity stores
contained addresses in an entry in the address cache. This entry
marked with a control bit, named the OR-bit Other ring bit").
load sharing will be done with a station related to an entry with
OR-bit set

If both dual FDDI rings are wrapped, the MACs of all stations
on one ring. Now, dual MAC stations placed on different dual
can communicate with DMARP. If a DMARP reply frame is received
the primary MAC and no entry exists for the sending station, a
entry with OR-Bit set will be created. Otherwise, the OR-bit will
set in the existing entry. If a DMARP reply frame is received by
secondary MAC and an entry with OR-bit set already exists for



Kuehn [Page 5]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


sending station, the bit will not be reset

This mechanism provides that no load sharing will be done
Dual MAC stations on different dual rings if the dual rings
linked with one transparent bridge. An additional DMARP error
is used to provide against errors when a DMARP reply frame gets
on the ring

8.4. Timeout of Entries Marked with OR-Bit

If a FDDI ring is wrapped, the DMARP reply frames are received by
primary and secondary MACs of the target dual MAC stations. In
case, the entries for dual MAC stations on the same dual ring
also marked with the OR-bit, although the load sharing is
between these stations

When an OR-bit in an entry is set for the first time, a timer
is started. If the timer entity runs out, a DMARP request frame
sent over SNAP 2 to the secondary MAC of the associated target
station. Then the entry will be discarded

If the request cannot be received by the target station because
network configuration has changed, there is no entry in the
cache for this station any more and no load sharing is computed.
the target station receives the DMARP request frame, it sends back
DMARP reply frame

8.5. Problems with the Application of Large FDDI

With an increasing number of dual FDDI rings, each one
together by two transparent bridges, the probability increases,
one of these inhomogeneous dual FDDI rings is wrapped in the
when two dual MAC stations exchange ARP frames and DMARP replies

If two dual MAC stations are communicating for the first time,
probability decreases that a load sharing is really computed
the exchange of DMARP replies, although this would be
according to the network configuration. It relies upon the fact
that DMARP replies get to the primary ring over the wrapped dual
and only entries marked with the OR-bit set are created. To
this problem further expedients are invented

At first, entries in the address cache can be marked read-only by
setting of the R-bit. In dual MAC stations, entries can be
manually for other dual MAC stations that are frequently talked to
that have a special importance. The control bits of these
cannot be changed by DMARP




Kuehn [Page 6]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


Next, additional control bits are introduced. One of these bits
the Hold-bit (H-bit). When two dual MAC stations exchange ARP
and DMARP replies to create entries in their address caches,
station starts sending a DMARP reply, first. According to
network state, it sends an additional DMARP error frame, a
later. Within a maximum period of time (see "Configuring the
Parameters"), all frames arrive at the neighbour station and
received by the primary and/or secondary MAC. If the OR-bit was
set for an entry within this period of time, it is clear, that
further DMARP frames will be received, which result in setting
OR-bit. For such an entry the H-bit is set. As the reception
reply and error frames is not sufficient for setting the OR-bit
the H-bit is set, the load sharing is assumed to be sure.
correctness of the H-bit will be verified in relatively long
periods by queries (query and hold frames) at the station associated

For two communicating stations there exists a possibility to
information from a third station. Always, when the OR-bit is set
an entry in a dual MAC station, a search frame is transmitted by
secondary MAC, containing the own primary MAC address and the
MAC address of the counter station. If a third station can compute
sure load sharing with both stations (the H-bit is set for
associated entries), the stations can perform a load sharing
them, too. The third station informs these stations by sending
frames to them

8.6. Multicast and Broadcast Addresses in IP

If the destination hardware address of an IP frame is a multicast
broadcast hardware address, the frame is always delivered to SNAP 1
and sent on the primary ring, because one of the addressed
could be a single MAC station. IP frames which are delivered to
load sharing entity by SNAP 2 are discarded by the load
entity. Thus, the duplication of these frames can be prevented

9. Internal

One load Sharing entity exists in the load sharing layer. This
sharing entity consists of the address cache, the
administration and the multiplexer











Kuehn [Page 7]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


to ARP to
+----X----------------------------------------------------X--------+
| | | IP |
| | ARP frames read | frames |
| | entries | |
| +----------------------------+ +---------+ +----------+ |
| | Cache Administration |->-| Address |---->--| Multi- | |
| +----------------------------|->-| Cache | | plexer | |
| | | | | +---------+ | | |
| | | | | +----------+ |
| | ARP | DMARP | ARP | DMARP | | |
| | frames | frames | frames | frames IP | IP | |
| | | | | frames | frames | |
| | | | | | | |
+--X--------X--------X--------X-----------------------X--------X---+
to SNAP 1 to SNAP 2 to SNAP 1 to SNAP 2

9.1. The Address

In the address cache, the associations of primary MAC addresses
secondary MAC addresses are stored for other dual MAC stations on
network. There are no entries for single MAC stations

Because the OR- and the LS-bit (see table) always have
values, one of the bits is redundant. Afterwards the examination
an entry state gets easier by the introduction of both bits, they
defined together. The ARP is able to support other protocol
formats than the IP format. To support this ARP property by DMARP
the protocol type number as used in the ARP frames is stored in
entry of the address cache. So, a dual MAC station is able
communicate with another station with DMARP, even if the
station does not use IP. The numbers used in DMARP frames and
address cache for the protocol type and the address length are
over from ARP

name length
--------------------------------------------------------------------

P-MAC address 48 bit Address of the primary
in an other dual MAC

S-MAC address 48 bit Address of the secondary
in that

LS-bit 1 bit A load sharing can be
with that
("Load sharing bit")




Kuehn [Page 8]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


OR-bit 1 bit No load sharing may be
with that
("Other ring bit")

H-bit 1 bit The load sharing with
station is trusty
("Hold bit")

Q-bit 1 bit A query frame was sent to
station, no hold frame
received yet ("Query bit")

R-bit 1 bit This entry cannot be changed
DMARP ("Read-only bit")

V-bit 1 bit The entry is
("Valid bit")

subscript 32 bit Unique number, identifying


protocol type 16 bit Number of the protocol
that was last used in


9.2. The

The multiplexer deals with multiplexing the IP frames upon the
FDDI rings. Broadcast and multicast frames are always sent on
primary ring. Otherwise, the contents of the address cache and a
sharing criteria are used to decide on which of the rings an IP
has to be transmitted. If there is no entry for the primary
address of the destination station in the cache, the IP frame
transmitted on the primary ring. If there is an entry for
destination station and the LS-bit is set, a load sharing can be
with this station. Later on a load sharing criteria, which is
the scope of this document, decides, which one of the rings is
for transmission. An example for a load sharing criteria is
length of the transmit queues in the MACs. The multiplexer requires
abstract function only, which returns the appropriate ring for
transmission of an actual IP frame

Additionally, the multiplexer filters the received IP frames
multicast or broadcast frames received from the secondary MAC
discarded






Kuehn [Page 9]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


9.3. The Cache

The cache administration creates and deletes the entries in
address cache. For this purpose, it communicates with other
sharing entities in other dual MAC stations with the DMARP.
cache administration handles the delivery of ARP frames to the
and the SNAP entity in the station, respectively

The cache administration needs three timers for the communication
the DMARP, which have to be supported by the system environment.
of these timers must support a timer entity for each entry in
address cache, whereby a single one is running at a time

Supported timer services

TIMER_request(time, name, subscript
TIMER_response(name, subscript
TIMER_cancel(name, subscript):

A timer entity is started by the service TIMER_request and
by the TIMER_cancel service request. The TIMER_response
indicates that a timer entity has run out. The parameter name is
name of a timer: OR-Entry-Timer, Hold-Timer, or Query-Timer.
entry in the address cache is uniquely identified by a
subscript). This number is also the number of an associated
entity. How to dispose these numbers is a question
implementation. The parameter time determines the time period
the timer runs out. This parameter has the value OR-set-timeout
the OR-Entry-Timer, Hold-time for the Hold-Timer and Query-time
the Query-Timer

9.4. Configuring the Timer

The OR-set-timeout parameter for the OR-Entry-

The period of time, determined by this parameter, should
essentially longer than the maximum time for a frame to
around the entire network. The expression entire network
the network which is constituted by the subnetworks
together with transparent bridges. When entries with OR-bit
are created continuously for a dual MAC station by the
mechanism, this parameter determines the periods of time
the consecutive requests that are sent to this station. If
state of the dual FDDI ring changes and an entry with LS-bit
could be created, this parameter additionally determines
maximum time until the new entry is created. (If an entry
not be created by transmission of search frames.) Therefore,
OR-set-timeout parameter should be set to some 10 seconds



Kuehn [Page 10]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


The Hold-time parameter for the Hold-

The period of time, determined by this parameter, should as
be essentially longer than the maximum time for a frame to
around the entire network. When two stations communicate for
first time, they exchange ARP frames and DMARP replies.
Hold-time parameter determines the period of time until the
sharing is assumed to be accomplished after the setting of
LS-bit. In this period of time, the frames mentioned above
have reached its destination. If an entry would be marked
the H-bit incorrectly, the time until it gets corrected will
relatively long (Query time). Proposed dimension:
minutes

The Query-time parameter for the Query-

When an entry is marked with LS- and H-bit it is assumed,
load sharing can be performed with the associated station.
allow the correction of a wrong value of the H-bit,
correctness of the H-bit is tested in periods of time,
by the parameter Query-time. It is tested whether a frame
received, which was sent by the secondary MAC to the secondary
address of the target station. (The target station
the reception of the query frame by a hold frame.) To limit
traffic caused by the query and hold frames, the parameter Query
time should be set to several minutes

9.5. Format of DMARP

fieldname length
--------------------------------------------------------------------

hardware type 16 bit 1 = "ethernet

protocol type 16 bit 2048D = "
Protocol

length of hardware 8 bit Value in octets
addresses 6 for 48 bit MAC

length of protocol 8 bit Value in octets
addresses 4 for Internet

operation 16 bit 1: "reply
2: "request
3: "error
4: "search
5: "found



Kuehn [Page 11]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


6: "query
7: "hold

1. hardware address ...

2. hardware address ...

protocol address ...


protocol address ...


--------------------------------------------------------------------

The value for the field "protocol type" is the same as in ARP frames

9.6. Contents of DMARP

In the following tables of DMARP frames, the fields containing
length and type of protocol and hardware addresses are omitted

Format

+-------------------------------------------------------------+
| Operation | 1. hardware | 2. hardware | protocol | protocol |
| | address | address | address | address |
| | | | sender | receiver |
+-------------------------------------------------------------+

Operation = 1 (reply), 2 (request), 3 (error):
+-----------------------------------------------------------------+
| Operation | P-MAC address | S-MAC address | protocol | protocol |
| | sender | sender | address | address |
| | | | sender | receiver |
+-----------------------------------------------------------------+

+-------------------------------------------------------------------+
| Operation=4 | P-MAC | P-MAC address | protocol | broadcast |
| (search) | address | counter- | address | protocol |
| | sender | station | sender | address |
+-------------------------------------------------------------------+

+-------------------------------------------------------------------+
| Operation=5 | P-MAC | S-MAC address | protocol | broadcast |
| (found) | address | counter- | address | protocol |
| | sender | station | sender | address |
+-------------------------------------------------------------------+



Kuehn [Page 12]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


+-------------------------------------------------------------------+
| Operation=6 | S-MAC | P-MAC address | protocol | broadcast |
| (query) | address | counter- | address | protocol |
| | sender | station | sender | address |
+-------------------------------------------------------------------+

+-------------------------------------------------------------------+
| Operation=7 | P-MAC address | S-MAC address | protocol | protocol |
| (hold) | sender | sender | address | address |
| | | | sender | receiver |
+-------------------------------------------------------------------+

Apart from the error frames all frames are sent on the
ring. The reply, error and search frames are addressed to
broadcast hardware address. The request, found, query and
frames are addressed to an individual secondary MAC address

10. Formal

The following description is written in ESTELLE

10.1. Global Constants, Variables and

default individual queue

timescale ...;



PDU_type = ... ; (* format of a Protocol Data Unit
String of variable length *)
HW_addr_type = ... ; (* format of a 48 bit MAC address *)
PR_addr_type = ... ; (* General: format of a protocol
in an ARP or DMARP frame *)
IP_addr_type = ... ; (* General: format of an IP address *)
QoS_type = ... ; (* General: format of a Quality-of
-Service statement *)
timer_name_type = ... ; (* Type for the name of a system timer *)

flag = (reset,set);



(*
The values of these variables are set in the initialization part
by external management functions
*)




Kuehn [Page 13]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


My_P_MAC_addr : HW_addr_type; (* Address of the MAC, placed
the primary ring *)
My_S_MAC_addr : HW_addr_type; (* Address of the MAC, placed
the secondary ring *)
My_IP_address : IP_addr_type; (* IP address of this station *)
Broadcast_HW_addr : HW_addr_type; (* Broadcast MAC address (48 bit) *)
Broadcast_IP_addr : IP_addr_type; (* Broadcast IP address *)
dmarp_QoS : QoS_type; (* Quality_of_Service-
for DMARP frames *)

ethernet : integer; (* Type statement in DMARP frames *)
ip : integer; (* Number for IP as protocol type *)
fddi_addr_length : integer; (* Length of a MAC address in octetts *)
ip_addr_length : integer; (* Length of a IP address in octetts *)

OR_set_timeout : integer; (* Parameter for the OR-Entry-Timer *)
Query_time : integer; (* Parameter for the Hold-Timer *)
Hold_time : integer; (* Parameter for the Query-Timer *)

10.2.

channel SAPchn(User,Provider);
by User :
UNITDATA_
(
Source_addr : HW_addr_type
Dest_addr : HW_addr_type
QoS : QoS_type
PDU : PDU_type
)
by Provider :
UNITDATA_
(
Source_addr : HW_addr_type
Dest_addr : HW_addr_type
QoS : QoS_type
PDU : PDU_type
)

channel System_Access_Point_chn(User,Provider);
by User
TIMER_request(Time : integer
Timer_id : timer_name_type
subscript : integer);

TIMER_cancel(Timer_id : timer_name_type
subscript : integer);




Kuehn [Page 14]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


by Provider
TIMER_response(Timer_id : timer_name_type
subscript : integer);


10.3. The Module Header and Interaction

module LS_module systemprocess
ip LS_ARPSAP : SAPchn(Provider);
LS_IPSAP : SAPchn(Provider);
SNAP1_ARPSAP : SAPchn(User);
SNAP1_LSSAP : SAPchn(User);
SNAP1_IPSAP : SAPchn(User);
SNAP2_ARPSAP : SAPchn(User);
SNAP2_LSSAP : SAPchn(User);
SNAP2_IPSAP : SAPchn(User);
LS_System_Access_Point : System_Access_Point_chn(User);
end

10.4. The Modulebody of the Load Sharing

body LS_body for LS_module

module multiplexer_module process
ip LS_IPSAP : SAPchn(Provider);
SNAP1_IPSAP : SAPchn(User);
SNAP2_IPSAP : SAPchn(User);
end

module cache_administration_module process
ip LS_ARPSAP : SAPchn(Provider);
SNAP1_ARPSAP : SAPchn(User);
SNAP1_LSSAP : SAPchn(User);
SNAP2_ARPSAP : SAPchn(User);
SNAP2_LSSAP : SAPchn(User);
LS_System_Access_Point : System_Access_Point_chn(User);
end

body cache_administration_body for cache_administration_module
(* defined later *)
end

body multiplexer_body for multiplexer_module
(* defined later *)
end


cache_administration : cache_administration_module



Kuehn [Page 15]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


multiplexer : multiplexer_module



ethernet := 1;
ip := 2048;
fddi_addr_length := 6;
ip_addr_length := 4;
init cache_administration with cache_administration_body
init multiplexer with multiplexer_body
attach LS_IPSAP to multiplexer.LS_IPSAP
attach SNAP1_IPSAP to multiplexer.SNAP1_IPSAP
attach SNAP2_IPSAP to multiplexer.SNAP2_IPSAP
attach LS_ARPSAP to cache_administration.LS_ARPSAP
attach SNAP1_ARPSAP to cache_administration.SNAP1_ARPSAP
attach SNAP1_LSSAP to cache_administration.SNAP1_LSSAP
attach SNAP2_ARPSAP to cache_administration.SNAP2_ARPSAP
attach SNAP2_LSSAP to cache_administration.SNAP2_LSSAP
attach LS_System_Access_Point to cache_administration
LS_System_Access_Point
end; end

10.5. The Modulebody for the

body multiplexer_body for multiplexer_module


Type_of_addr_type = (individual, multi, broad);
ring_type = (primary, secondary);


act_S_MAC_addr : HW_addr_type

function determ_addrtype(HW_addr: HW_addr_type): Type_of_addr_type
primitive
(*
Returns the type of a hardware address
(Individual, multicast or broadcast address
*)

function get_cacheentry(prtype: integer; P_MAC_addr: HW_addr_type
var S_MAC_addr : HW_addr_type): boolean
primitive
(*
Returns the associated secondary MAC address for a given primary
address and protocol type. If an entry exists, the value TRUE
returned
*)



Kuehn [Page 16]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


function ls_criteria : ring_type
(*
Returns the ring on which the actual frame should be transmitted
*)
primitive



when LS_IPSAP.UNITDATA_request(Source_addr,Dest_addr,QoS,PDU)
if determ_addrtype(Dest_addr) <> individual
output SNAP1_IPSAP.UNITDATA_request(Source_addr,Dest_addr,QoS,PDU);
else
if get_cacheentry(ip,Dest_addr,act_S_MAC_addr)
(ls_criteria=secondary)
output SNAP2_IPSAP.UNITDATA_request(My_S_MAC_addr
act_S_MAC_addr,QoS,PDU);

output SNAP1_IPSAP.UNITDATA_request(Source_addr,Dest_addr,QoS,PDU);
end
end

when SNAP1_IPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU

output LS_IPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU);
end

when SNAP2_IPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU

if determ_addrtype(Dest_addr) = individual then
Dest_addr := My_P_MAC_addr
output LS_IPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU);
end
end

10.6. The Modulebody for the Cache

body cache_administration_body for cache_administration_module


arp_pdu_type =
hwtype : integer
prtype : integer
HW_length : integer
PR_length : integer
operation : (request,reply);
HW_sender : HW_addr_type
PR_sender : PR_addr_type
HW_receiver : HW_addr_type



Kuehn [Page 17]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


PR_receiver : PR_addr_type
end

dmarp_operation_type = (request,reply,error,search,found,query,hold);

dmarp_pdu_type =
hwtype : integer
prtype : integer
HW_length : integer
PR_length : integer
operation : dmarpoperation_type
HW_1 : HW_addr_type
HW_2 : HW_addr_type
PR_sender : PR_addr_type
PR_receiver : PR_addr_type
end


arp_pdu : arp_pdu_type
dmarp_pdu : dmarp_pdu_type
send_pdu : dmarp_pdu_type
act_P_MAC_addr : HW_addr_type

function my_pr_address(prtype : integer ; praddr : PR_addr_type):
boolean
(*
Returns TRUE, if praddr is my station address, the protocol type
prtype. (2048d for the Internet protocol
*)
primitive

function get_my_pr_addr(prtype : integer) : PR_addr_type
(*
Returns my station address, the protocol has the number prtype
*)

function extract_arp_pdu(PDU : PDU_type) : arp_pdu_type
(*
Returns the data contained in an ARP PDU as a record
*)
primitive

function extract_dmarp_pdu(PDU : PDU_type) : dmarp_pdu_type
(*
Returns the data contained in an DMARP PDU as a record
*)
primitive




Kuehn [Page 18]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


function assemble_dmarp_pdu(dmarp_pdu : dmarp_pdu_type): PDU
(*
Returns a DMARP PDU from the data in the record
*)
primitive

procedure create_entry(prtype: integer; P_MAC_addr: HW_addr_type
S_MAC_addr: HW_addr_type; LS_Bit: flag; OR_Bit: flag
H_Bit: flag; Q_Bit: flag; R_Bit: flag; V_Bit: flag);
(*
Creates a new entry in the address cache, if no entry with the
primary MAC address or R-bit set to one exists. The protocol type
the number prtype. The control bits are set as given in the parameters
the LS-bit is set last
*)
primitive

function search_entry(prtype : integer; P_MAC_addr : HW_addr_type):
boolean
(*
Returns TRUE if an entry with the primary MAC address P_MAC_addr
the given protocol type was found in the address cache
*)
primitive

procedure update_entry(prtype: integer; P_MAC_addr: HW_addr_type
S_MAC_addr: HW_addr_type);
(*
Searches an entry with the given primary MAC address P_MAC_address
updates the secondary MAC address in the entry if the R-bit is set
zero
*)
primitive

procedure reset_LS_bit(prtype: integer; P_MAC_addr : HW_addr_type);
(*
Searches an entry with the given primary MAC address P_MAC_address
resets the LS-bit if the R-bit is reset
*)
primitive

procedure set_Q_bit(prtype: integer; P_MAC_addr : HW_addr_type);
(*
Searches an entry with the given primary MAC address P_MAC_address
sets the Q-bit if the R-bit is reset
*)
primitive




Kuehn [Page 19]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


function H_bit_set(prtype: integer; P_MAC_addr : HW_addr_type):
boolean
(*
Returns TRUE if an entry exists with H-bit set to one and the
P-MAC address
*)
primitive

function OR_bit_set(prtype: integer; P_MAC_addr : HW_addr_type):
boolean
(*
Returns TRUE if an entry exists with OR-bit set to one and the
P-MAC address
*)
primitive

function LS_bit_set(prtype: integer; P_MAC_addr : HW_addr_type):
boolean
(*
Returns TRUE if an entry exists with LS-bit set to one and the
P-MAC address
*)
primitive

function Q_bit_set(prtype: integer; P_MAC_addr : HW_addr_type):
boolean
(*
Returns TRUE if an entry exists with Q-bit set to one and the
P-MAC address
*)
primitive

function get_subscript(prtype: integer; P_MAC_addr : HW_addr_type):
integer
(*
Returns the subscipt number of an entry with the given primary
address
*)
primitive

function get_broadcast_addr(prtype : integer): PR_addr_type
(*
Returns the broadcast protocol address for the given protocol type
*)

function get_P_MAC_addr(subscript : integer) : HW_addr_type
(*
Returns the primary MAC address of the entry with the given



Kuehn [Page 20]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


number
*)
primitive

function get_S_MAC_addr(prtype: integer; P_MAC_addr: HW_addr_type):
HW_addr_type
(*
Returns the secondary MAC address of the station with the given
MAC address
*)
primitive

procedure delete_entry(subscript : integer);
(*
Deletes the entry with the given subscript number if the R-bit
reset
*)
primitive

function get_pr_type(subscript : integer) : integer
(*
Returns the protocol type for the entry with the given
number
*)
primitive

function get_pr_length(prtype : integer) : integer
(*
Returns the length of a protocol address
*)
primitive




when LS_ARPSAP.UNITDATA_request(Source_addr,Dest_addr,QoS,PDU

arp_pdu := extract_arp_pdu(PDU);
output SNAP1_ARPSAP.UNITDATA_request(Source_addr,Dest_addr,QoS,PDU);
dmarp_pdu.hwtype := ethernet
dmarp_pdu.prtype := arp_pdu.prtype
dmarp_pdu.HW_length := fddi_addr_length
dmarp_pdu.PR_length := arp_pdu.PR_length
dmarp_pdu.operation := reply
dmarp_pdu.HW_1 := My_P_MAC_addr
dmarp_pdu.HW_2 := My_S_MAC_addr
dmarp_pdu.PR_sender := arp_pdu.PR_sender
dmarp_pdu.PR_receiver := arp_pdu.PR_receiver



Kuehn [Page 21]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


PDU := assemble_dmarp_pdu(dmarp_pdu);
output SNAP2_LSSAP.UNITDATA_request(My_S_MAC_addr,Broadcast_HW_addr
dmarp_QoS,PDU);
end


when SNAP1_ARPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU

output LS_ARPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU);
end

when SNAP2_ARPSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU
begin end

when SNAP1_LSSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU

dmarp_pdu := extract_dmarp_pdu(PDU);
if ((dmarp_pdu.operation = error) or (dmarp_pdu.operation = reply))
then
if my_pr_address(dmarp_pdu.prtype,dmarp_pdu.PR_receiver) then
if not H_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) then
if not OR_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) then
if LS_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) then
output LS_System_Access_point.TIMER_cancel
"Hold_Timer",get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
create_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2,
reset,set,reset,reset,reset,set);
end
output LS_System_Access_point.TIMER_request
OR_set_timeout,"OR_Entry_Timer",
get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
send_pdu.hwtype := ethernet
send_pdu.prtype := dmarp_pdu.prtype
send_pdu.HW_length := fddi_addr_length
send_pdu.PR_length := dmarp_pdu.PR_length
send_pdu.operation := search
send_pdu.HW_1 := My_P_MAC_addr
send_pdu.HW_2 := dmarp_pdu.HW_1;
send_pdu.PR_sender := get_my_pr_addr(dmarp_pdu.prtype);
send_pdu.PR_receiver := get_broadcast_addr(dmarp_pdu.prtype);
PDU := assemble_dmarp_pdu(dmarp_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,Broadcast_HW_addr,dmarp_QoS,PDU);
end else
if dmarp_pdu.operation=error
update_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2);
end
end else



Kuehn [Page 22]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


if dmarp_pdu.operation = error
update_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2);
end
end else
if my_pr_address(dmarp_pdu.prtype,dmarp_pdu.PR_sender)
(dmarp_pdu.operation = reply) then
dmarp_pdu.operation := error
PDU := assemble_dmarp_pdu(dmarp_pdu);
output SNAP1_LSSAP.UNITDATA_request
My_P_MAC_addr,Broadcast_HW_addr,dmarp_QoS,PDU);
end else
if dmarp_pdu.operation=error
search_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1)
update_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2);
end; end; end; end


when SNAP2_LSSAP.UNITDATA_indication(Source_addr,Dest_addr,QoS,PDU

dmarp_pdu := extract_dmarp_pdu(PDU);
if (dmarp_pdu.operation = found)
my_pr_address(dmarp_pdu.prtype,dmarp_pdu.PR_receiver) then
if not H_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) then
if OR_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) then
output LS_System_Access_Point
TIMER_cancel("OR_Entry_Timer",
get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
end
if LS_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) then
output LS_System_Access_Point
TIMER_cancel("Hold_Timer",
get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
end
create_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2,
set,reset,set,reset,reset,set);
output LS_System_Access_Point.TIMER_request(Query_time,"Query_Timer",
get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
end
end else
if (dmarp_pdu.operation = reply)
(dmarp_pdu.operation = request) then
if search_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1)
update_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2);
end
if (dmarp_pdu.operation=request)
my_pr_address(dmarp_pdu.prtype,dmarp_pdu.PR_receiver) then
send_pdu.hwtype := dmarp_pdu.hwtype
send_pdu.prtype := dmarp_pdu.prtype



Kuehn [Page 23]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


send_pdu.HW_length := fddi_addr_length
send_pdu.PR_length := dmarp_pdu.PR_length
send_pdu.operation := reply
send_pdu.HW_1 := My_P_MAC_addr
send_pdu.HW_2 := My_S_MAC_addr
send_pdu.PR_sender := get_my_pr_addr(dmarp_pdu.prtype);
send_pdu.PR_receiver := dmarp_pdu.PR_sender
PDU := assemble_dmarp_pdu(dmarp_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,Broadcast_HW_addr,dmarp_QoS,PDU);
end else
if my_pr_address(dmarp_pdu.prtype,dmarp_pdu.pr_receiver) then
case dmarp_pdu.operation
reply:
if not ( OR_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1)
LS_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) )then
create_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2,
set,reset,reset,reset,reset,set);
output LS_System_Access_Point.TIMER_request(Hold_time
"Hold_Timer",get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
end
end

error:
if not ( OR_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1)
H_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1) ) then
if LS_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1)
output LS_System_access_point.TIMER_cancel
"Hold_Timer",get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
create_entry(dmarp_pdu.prtype,dmarp_pdu.HW_1,dmarp_pdu.HW_2,
reset,set,reset,reset,reset,set);
output LS_System_access_point.TIMER_request
OR_set_timeout,"OR_Entry_Timer",
get_subscript(dmarp_pdu.prtype,dmarp_pdu.HW_1));
send_pdu.hwtype := ethernet
send_pdu.prtype := dmarp_pdu.prtype
send_pdu.HW_length := fddi_addr_length
send_pdu.PR_length := dmarp_pdu.PR_length
send_pdu.operation := search
send_pdu.HW_1 := My_P_MAC_addr
send_pdu.HW_2 := dmarp_pdu.HW_1;
send_pdu.PR_sender := get_my_pr_addr(dmarp_pdu.prtype);
send_pdu.PR_receiver := get_broadcast_addr(dmarp_pdu.prtype);
PDU := assemble_dmarp_pdu(dmarp_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,Broadcast_HW_addr,dmarp_QoS,PDU);
end
end



Kuehn [Page 24]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


search:
if not (dmarp_pdu.HW_1=My_P_MAC_addr
dmarp_pdu.HW_2=My_P_MAC_addr) then
if H_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1)
H_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_2) then
send_pdu.hwtype := ethernet
send_pdu.prtype := dmarp_pdu.prtype
send_pdu.HW_length := fddi_addr_length
send_pdu.PR_length := dmarp_pdu.PR_length
send_pdu.operation := found
send_pdu.HW_1 := dmarp_pdu.HW_2;
send_pdu.HW_2 := get_S_MAC_addr(dmarp_pdu.prtype
dmarp_pdu.HW_2);
send_pdu.PR_sender := get_my_pr_addr(dmarp_pdu.prtype);
send_pdu.PR_receiver := get_broadcast_addr(dmarp_pdu.prtype);
PDU := assemble_dmarp_pdu(send_pdu);
output SNAP2_LSSAP.UNITDATA_request(My_S_MAC_addr
get_S_MAC_addr(dmarp_pdu.prtype,dmarp_pdu.HW_1),dmarp_QoS,PDU);
send_pdu.HW_1 := dmarp_pdu.HW_1;
send_pdu.HW_2 := get_S_MAC_addr(dmarp_pdu.prtype
dmarp_pdu.HW_1);
PDU := assemble_dmarp_pdu(send_pdu);
output SNAP2_LSSAP.UNITDATA_request(My_S_MAC_addr
get_S_MAC_addr(dmarp_pdu.prtype,dmarp_pdu.HW_2),dmarp_QoS,PDU);
end
end
end


Query:
if dmarp_pdu.HW_2 = My_P_MAC_addr then
send_pdu.hwtype := ethernet
send_pdu.prtype := dmarp_pdu.prtype
send_pdu.HW_length := dmarp_pdu.HW_length
send_pdu.PR_length := dmarp_pdu.PR_length
send_pdu.operation := hold
send_pdu.HW_1 := My_P_MAC_addr
send_pdu.HW_2 := My_S_MAC_addr
send_pdu.PR_sender := get_my_pr_addr(dmarp_pdu.prtype);
send_pdu.PR_receiver := dmarp_pdu.PR_sender
PDU := assemble_dmarp_pdu(send_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,dmarp_pdu.HW_1,dmarp_QoS,PDU);
end
end
Hold:
if H_bit_set(dmarp_pdu.prtype,dmarp_pdu.HW_1)
reset_Q_bit(dmarp_pdu.prtype,dmarp_pdu.HW_1);



Kuehn [Page 25]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


end
end
end
end
end
end


when LS_System_Access_Point.TIMER_response(Timer_name,subscript)
case Timer_name
"OR_Entry_Timer":
act_P_MAC_addr := get_P_MAC_addr(subscript);
if OR_bit_set(get_pr_type(subscript),act_P_MAC_addr) then
send_pdu.hwtype := ethernet
send_pdu.prtype := get_pr_type(subscript);
send_pdu.HW_length := fddi_addr_length
send_pdu.PR_length := get_pr_length(send_pdu.prtype);
send_pdu.operation := request
send_pdu.HW_1 := My_P_MAC_addr
send_pdu.HW_2 := My_S_MAC_addr
send_pdu.PR_sender := get_my_pr_addr(send_pdu.prtype);
send_pdu.PR_receiver := get_broadcast_addr(send_pdu.prtype);
PDU := assemble_dmarp_pdu(send_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,get_S_MAC_addr(send_pdu.prtype,act_P_MAC_addr),
dmarp_QoS,PDU);
delete_entry(subscript);
end
end
"Hold_Timer":
act_P_MAC_addr := get_P_MAC_addr(subscript);
if (not H_bit_set(get_pr_type(subscript),act_P_MAC_addr))
LS_bit_set(get_pr_type(subscript),act_P_MAC_addr) then
set_H_bit(get_pr_type(subscript),act_P_MAC_addr);
output LS_System_Access_point.TIMER_request
Query_time,"Query_Timer",subscript);
end
end
"Query_Timer":
act_P_MAC_addr := get_P_MAC_addr(subscript);
send_pdu.hwtype := ethernet
send_pdu.prtype := get_pr_type(subscript);
send_pdu.HW_length := fddi_addr_length
send_pdu.PR_length := get_pr_length(send_pdu.prtype);
send_pdu.PR_sender := get_my_pr_addr(send_pdu.prtype);
send_pdu.PR_receiver := get_broadcast_addr(send_pdu.prtype);
if Q_bit_set(get_pr_type(subscript),act_P_MAC_addr) then
send_pdu.HW_1 := My_P_MAC_addr



Kuehn [Page 26]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


send_pdu.HW_2 := My_S_MAC_addr
send_pdu.operation := request
PDU := assemble_dmarp_pdu(send_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,get_S_MAC_addr(send_pdu.prtype,act_P_MAC_addr),
dmarp_QoS,PDU);
delete_entry(subscript);
end else
send_pdu.HW_1 := My_S_MAC_addr
send_pdu.HW_2 := get_P_MAC_addr(subscript);
send_pdu.operation := query
PDU := assemble_dmarp_pdu(send_pdu);
output SNAP2_LSSAP.UNITDATA_request
My_S_MAC_addr,get_S_MAC_addr(send_pdu.prtype,send_pdu.HW_2),
dmarp_QoS,PDU);
set_Q_bit(send_pdu.prtype,send_pdu.HW_2);
end; end; end; end; end; (* body *)

11.

The introduction of the load sharing layer in the protocol
of the dual MAC stations allows the application of IP and ARP
inhomogeneous FDDI rings. The protocol suite of single MAC
needs no modification

By the load sharing layer, the property "dual MAC" is transparent
ARP, IP and the higher layer protocols

In dual MAC stations, any load sharing criteria may be implemented
the multiplexer of the load sharing entity. The conversion
addresses, the exchange of address and reachability
between dual MAC stations and the proper transmission of
and broadcast frames is taken upon by the load sharing entity

12.

[1] ANSI, "FDDI Station Management (SMT)",
X3T9/90-X3T9.5/84-49 Rev 6.2, May 1990.

[2] ANSI, "FDDI Media Access Control (MAC-2)",
X3T9/90-X3T9.5/88-139 Rev 3.2, June 1990.

[3] ISO, "Information processing systems- Local area networks
Part 2: Logical link control", ISO 8802-2:1989, August 1989.

[4] IEEE, "Draft Standard P802.1A Overview and Architecture",
P802.1A/D9-89/74, September 1989.




Kuehn [Page 27]

RFC 1329 Address Resolution for Dual MAC FDDI Networks May 1992


[5] Plummer, C., "An Ethernet Address Resolution Protocol --or--
Converting Network Protocol Addresses to 48.bit
Address for Transmission on Ethernet Hardware", RFC 826, MIT
November 1982.

[6] Reynolds, J., and Postel, J., "Assigned Numbers", RFC 1060,
USC/Information Sciences Institute, March 1990.

[7] Postel, J., "Internet Protocol", RFC 791, USC/
Sciences Institute, September 1981.

[8] Katz, D., "A Proposed Standard for the Transmission of
Datagrams over FDDI Networks", RFC 1188, Merit/NSFNET
October 1990.

[9] Internet Engineering Task Force, Braden, R., Editor
"Requirements for Internet Hosts -- Communication Layers",
RFC 1122, IETF, October 1989.

[10] Katz, D., "The Use of Connectionless Network Layer
over FDDI Networks", Merit/NSFNET, 1990.

13. Security

Security issues are not discussed in this memo

14. Author's

Peter
Raiffeisenstrasse 9
8933


Phone: .. 82 32 / 7 46 02
EMail: thimmela@sniabg.wa.sni.
















Kuehn [Page 28]







if you see any problems within the linking, don't worry be happy,
this is version 0.1 of the Relevance System and you gotta expect some crappy subroutines sometimes,
just be content we did not write this in Java, which would have made this "bigger and better" HAHAHHA.




RFC documents can be found at I.E.T.F.



Relevance System Copyright © 2002 Spectrum WorldResearch
other technical nosh by ServerMasters Corporation
collaboration of BobX







Spectrum