< draft-ietf-ipatm-ipmc-10.txt   draft-ietf-ipatm-ipmc-11.txt >
Internet-Draft Grenville Armitage Internet-Draft Grenville Armitage
Bellcore Bellcore
December 5th, 1995 February 9th, 1996
Support for Multicast over UNI 3.0/3.1 based ATM Networks. Support for Multicast over UNI 3.0/3.1 based ATM Networks.
<draft-ietf-ipatm-ipmc-10.txt> <draft-ietf-ipatm-ipmc-11.txt>
Status of this Memo Status of this Memo
This document was submitted to the IETF IP over ATM WG. Publication This document was submitted to the IETF IP over ATM WG. Publication
of this document does not imply acceptance by the IP over ATM WG of of this document does not imply acceptance by the IP over ATM WG of
any ideas expressed within. Comments should be submitted to the ip- any ideas expressed within. Comments should be submitted to the ip-
atm@matmos.hpl.hp.com mailing list. atm@matmos.hpl.hp.com mailing list.
Distribution of this memo is unlimited. Distribution of this memo is unlimited.
skipping to change at page 30, line 25 skipping to change at page 30, line 25
management as described in section 5.1.4 (the interpretation being management as described in section 5.1.4 (the interpretation being
that the join/leave operation applies to all addresses in range from that the join/leave operation applies to all addresses in range from
<min> to <max> inclusive, for every <min,max> pair). <min> to <max> inclusive, for every <min,max> pair).
In RFC1112 environments a MARS_JOIN for a single group is triggered In RFC1112 environments a MARS_JOIN for a single group is triggered
by a JoinLocalGroup signal from the IP layer. A MARS_LEAVE for a by a JoinLocalGroup signal from the IP layer. A MARS_LEAVE for a
single group is triggered by a LeaveLocalGroup signal from the IP single group is triggered by a LeaveLocalGroup signal from the IP
layer. layer.
Cluster members with special requirements (e.g. multicast routers) Cluster members with special requirements (e.g. multicast routers)
may issue MARS_JOINs and MARS_LEAVEs specifying a block of multicast may issue MARS_JOINs and MARS_LEAVEs specifying a single block of 2
group addresses. or more multicast group addresses. However, a cluster member SHALL
NOT issue such a multi-group block join for an address range fully or
partially overlapped by multi-group block join(s) that the cluster
member has previously issued and not yet retracted. A cluster member
MAY issue combinations of single group MARS_JOINs that overlap with a
multi-group block MARS_JOIN.
An endpoint MUST register with a MARS in order to become a member of An endpoint MUST register with a MARS in order to become a member of
a cluster and be added as a leaf to ClusterControlVC. Registration a cluster and be added as a leaf to ClusterControlVC. Registration
is covered in section 5.2.3. is covered in section 5.2.3.
Finally, the endpoint MUST be capable of terminating unidirectional Finally, the endpoint MUST be capable of terminating unidirectional
VCs (i.e. act as a leaf node of a UNI 3.0/3.1 point to multipoint VC, VCs (i.e. act as a leaf node of a UNI 3.0/3.1 point to multipoint VC,
with zero bandwidth assigned on the return path). RFC 1755 describes with zero bandwidth assigned on the return path). RFC 1755 describes
the signalling information required to terminate VCs carrying the signalling information required to terminate VCs carrying
LLC/SNAP encapsulated traffic (discussed further in section 5.5). LLC/SNAP encapsulated traffic (discussed further in section 5.5).
skipping to change at page 44, line 30 skipping to change at page 44, line 30
multiple layer 3 protocols. The CMIs allocated by the MARS for each multiple layer 3 protocols. The CMIs allocated by the MARS for each
such registration may or may not be the same. such registration may or may not be the same.
The retransmitted registration MARS_JOIN must NOT be sent on The retransmitted registration MARS_JOIN must NOT be sent on
ClusterControlVC. If a cluster member issues a deregistration ClusterControlVC. If a cluster member issues a deregistration
MARS_LEAVE it too is retransmitted privately. MARS_LEAVE it too is retransmitted privately.
Non-registration MARS_JOIN and MARS_LEAVE messages are ignored if Non-registration MARS_JOIN and MARS_LEAVE messages are ignored if
they arrive from a node that is not registered as a cluster member. they arrive from a node that is not registered as a cluster member.
Except as described in section 6.2.4, after performing any required
database updates non-registration MARS_JOIN and MARS_LEAVE messages
are retransmitted on ClusterControlVC. The following fields are
modified just prior to retransmission:
mar$flags.copy is set to 1.
mar$msn is set to the current Cluster Sequence Number for
ClusterControlVC (Section 5.1.4.2).
The MARS retransmits MARS_JOIN and MARS_LEAVE messages even if they
resulted in no change to the database.
MARS_JOIN or MARS_LEAVE messages MUST arrive at the MARS with MARS_JOIN or MARS_LEAVE messages MUST arrive at the MARS with
mar$flags.copy set to 0, otherwise the message is silently ignored. mar$flags.copy set to 0, otherwise the message is silently ignored.
All outgoing MARS_JOIN or MARS_LEAVE messages have mar$flags.copy set
to 1. All outgoing MARS_JOIN or MARS_LEAVE messages SHALL have
mar$flags.copy set to 1, and mar$msn set to the current Cluster
Sequence Number for ClusterControlVC (Section 5.1.4.2).
mar$flags.layer3grp (section 5.3) MUST be ignored (and treated as mar$flags.layer3grp (section 5.3) MUST be ignored (and treated as
reset) for MARS_JOINs specifying more than a single group. If a reset) for MARS_JOINs specifying more than a single group. If a
MARS_JOIN/LEAVE is received that contains more than one <min,max> MARS_JOIN/LEAVE is received that contains more than one <min,max>
pair, the MARS MUST silently drop the message. pair, the MARS MUST silently drop the message.
If one or more MCSs have registered with the MARS, message processing
continues as described in section 6.2.4.
The MARS database is updated to add the node to any indicated
group(s) that it was not already considered a member of, and message
processing continues as follows:
If a single group was being joined or left:
mar$flags.punched is set to 0.
If the joining (leaving) node was already (is still) considered a
member of the specified group, the message is retransmitted
privately back to the cluster member. Otherwise the message is
retransmitted on ClusterControlVC.
If a single block covering 2 or more groups was being joined or left:
A copy of the original MARS_JOIN/LEAVE is made. This copy then has
its <min,max> block replaced with a 'hole punched' set of zero or
more <min,max> pairs. The 'hole punched' set of <min,max> pairs
covers the entire address range specified by the original
<min,max> pair, but excludes those addresses/groups which the
joining (leaving) node is already (still) a member of due to a
previous single group join.
If no 'holes' were punched in the specified block, the original
MARS_JOIN/LEAVE is retransmitted out on ClusterControlVC.
Otherwise the following occurs:
The original MARS_JOIN/LEAVE is transmitted back to the source
cluster member unchanged, using the VC it arrived on. The
mar$flags.punched field MUST be reset to 0 in this message.
If the hole-punched set contains 1 or more <min,max> pair, the
copy of the original MARS_JOIN/LEAVE is transmitted on
ClusterControlVC, carrying the new <min,max> list. The
mar$flags.punched field MUST be set to 1 in this message.
(The mar$flags.punched field is set to ensure the hole-punched
copy is ignored by the message's source when trying to match
received MARS_JOIN/LEAVE messages with ones previously sent
(section 5.2.2)).
If the MARS receives a deregistration MARS_LEAVE (described in If the MARS receives a deregistration MARS_LEAVE (described in
section 5.2.3) that member's ATM address MUST be removed from all section 5.2.3) that member's ATM address MUST be removed from all
groups for which it may have joined, dropped from ClusterControlVC, groups for which it may have joined, dropped from ClusterControlVC,
and the CMI released. and the CMI released.
If the MARS receives an ERR_L_RELEASE on ClusterControlVC indicating If the MARS receives an ERR_L_RELEASE on ClusterControlVC indicating
that a cluster member has disconnected, that member's ATM address that a cluster member has disconnected, that member's ATM address
MUST be removed from all groups for which it may have joined, and the MUST be removed from all groups for which it may have joined, and the
CMI released. CMI released.
skipping to change at page 48, line 26 skipping to change at page 49, line 9
from the server maps for each specified group, deleting any server from the server maps for each specified group, deleting any server
maps that end up being null after the operation. maps that end up being null after the operation.
The operation code is then changed to MARS_LEAVE and sends a copy of The operation code is then changed to MARS_LEAVE and sends a copy of
the message on ClusterControlVC. This fools the cluster members into the message on ClusterControlVC. This fools the cluster members into
thinking a leaf node as been dropped from the group specified. In the thinking a leaf node as been dropped from the group specified. In the
retransmitted MARS_LEAVE mar$flags.layer3grp MUST be zero, retransmitted MARS_LEAVE mar$flags.layer3grp MUST be zero,
mar$flags.copy MUST be one, and mar$flags.register MUST be zero. mar$flags.copy MUST be one, and mar$flags.register MUST be zero.
The MARS retransmits redundant MARS_MSERV and MARS_UNSERV messages The MARS retransmits redundant MARS_MSERV and MARS_UNSERV messages
onto ServerControlVC, generates the appropriate MARS_JOIN or or directly back to the MCS generating them. MARS_MIGRATE messages are
MARS_LEAVE messages on ClusterControlVC, but takes no further action. never repeated in response to redundant MARS_MSERVs.
MARS_MIGRATE messages are never repeated in response to redundant
MARS_MSERVs.
The last or only MCS for a group MAY choose to issue a MARS_UNSERV The last or only MCS for a group MAY choose to issue a MARS_UNSERV
while the group still has members. When the MARS_UNSERV is processed while the group still has members. When the MARS_UNSERV is processed
by the MARS the 'server map' will be deleted. When the associated by the MARS the 'server map' will be deleted. When the associated
MARS_LEAVE is issued on ClusterControlVC, all cluster members with a MARS_LEAVE is issued on ClusterControlVC, all cluster members with a
VC open to the MCS for that group will close down the VC (in VC open to the MCS for that group will close down the VC (in
accordance with section 5.1.4, since the MCS was their only leaf accordance with section 5.1.4, since the MCS was their only leaf
node). When cluster members subsequently find they need to transmit node). When cluster members subsequently find they need to transmit
packets to the group, they will begin again with the packets to the group, they will begin again with the
MARS_REQUEST/MARS_MULTI sequence to establish a new VC. Since the MARS_REQUEST/MARS_MULTI sequence to establish a new VC. Since the
skipping to change at page 51, line 4 skipping to change at page 51, line 31
A copy of the MARS_JOIN/LEAVE is made with type MARS_SJOIN or A copy of the MARS_JOIN/LEAVE is made with type MARS_SJOIN or
MARS_SLEAVE as appropriate, and transmitted on ServerControlVC. MARS_SLEAVE as appropriate, and transmitted on ServerControlVC.
This allows the MCS(s) supporting the group to note the membership This allows the MCS(s) supporting the group to note the membership
change and update their outgoing point to multipoint VCs. change and update their outgoing point to multipoint VCs.
Before transmission on the ClusterControlVC, the original Before transmission on the ClusterControlVC, the original
MARS_JOIN/LEAVE then has its <min,max> block replaced with a 'hole MARS_JOIN/LEAVE then has its <min,max> block replaced with a 'hole
punched' set of zero or more <min,max> pairs. The 'hole punched' punched' set of zero or more <min,max> pairs. The 'hole punched'
set of <min,max> pairs covers the entire address range specified set of <min,max> pairs covers the entire address range specified
by the original <min,max> pair, but excludes those by the original <min,max> pair, but excludes those
addresses/groups supported by MCSs. addresses/groups supported by MCSs or which the joining (leaving)
node is already (still) a member of due to a previous single group
join.
If no 'holes' were punched in the specified block, the original If no 'holes' were punched in the specified block, the original
MARS_JOIN/LEAVE is re-transmitted out on ClusterControlVC MARS_JOIN/LEAVE is re-transmitted out on ClusterControlVC
unchanged. Otherwise the following occurs: unchanged. Otherwise the following occurs:
The original MARS_JOIN/LEAVE is transmitted back to the source The original MARS_JOIN/LEAVE is transmitted back to the source
cluster member unchanged, using the VC it arrived on. The cluster member unchanged, using the VC it arrived on. The
mar$flags.punched field MUST be reset to 0 in this message. mar$flags.punched field MUST be reset to 0 in this message.
If the hole-punched set contains 1 or more <min,max> pair, a If the hole-punched set contains 1 or more <min,max> pair, a
skipping to change at page 65, line 20 skipping to change at page 65, line 45
Susan Symington and Bryan Gleeson (Adaptec) independently championed Susan Symington and Bryan Gleeson (Adaptec) independently championed
the need for the service provided by MARS_GROUPLIST_REQUEST/REPLY. the need for the service provided by MARS_GROUPLIST_REQUEST/REPLY.
The new encapsulation scheme arose from WG discussions, captured by The new encapsulation scheme arose from WG discussions, captured by
Bryan Gleeson in an interim Internet Draft (with Keith McCloghrie Bryan Gleeson in an interim Internet Draft (with Keith McCloghrie
(Cisco), Andy Malis (Ascom Nexion), and Andrew Smith (Bay Networks) (Cisco), Andy Malis (Ascom Nexion), and Andrew Smith (Bay Networks)
as key contributors). James Watt (Newbridge) and Joel Halpern as key contributors). James Watt (Newbridge) and Joel Halpern
(Newbridge) motivated the development of a more multiprotocol MARS (Newbridge) motivated the development of a more multiprotocol MARS
control message format, evolving it away from its original ATMARP control message format, evolving it away from its original ATMARP
roots. They also motivated the development of Type #1 and Type #2 roots. They also motivated the development of Type #1 and Type #2
data path encapsulations. At the last minute Rajesh Talpade (Georgia data path encapsulations. Rajesh Talpade (Georgia Tech) helped
Tech) clarified the need for the MARS_MIGRATE function. clarify the need for the MARS_MIGRATE function.
Maryann Maher (ISI) provided valuable sanity and implementation
checking during the latter stages of the document's development.
Finally, Jim Rubas (IBM) supplied the MARS pseudo-code in Appendix F Finally, Jim Rubas (IBM) supplied the MARS pseudo-code in Appendix F
and provided detailed proof-reading in the latter stages of the and also provided detailed proof-reading in the latter stages of the
documents development. document's development.
Author's Address Author's Address
Grenville Armitage Grenville Armitage
Bellcore, 445 South Street Bellcore, 445 South Street
Morristown, NJ, 07960 Morristown, NJ, 07960
USA USA
Email: gja@thumper.bellcore.com Email: gja@thumper.bellcore.com
Ph. +1 201 829 2635 Ph. +1 201 829 2635
skipping to change at page 76, line 14 skipping to change at page 76, line 14
Return. Return.
- MARS_MULTI - MARS_MULTI
Construct a MARS_MULTI for the specified map. Construct a MARS_MULTI for the specified map.
If the param indicates TLV support then { If the param indicates TLV support then {
Process the TLV as required. Process the TLV as required.
} }
Return. Return.
- MARS_JOIN - MARS_JOIN
If (mar$flags.copy != 0) silently ignore the message. If (mar$flags.copy != 0) silently ignore the message.
If more than a single <min,max> pair is specified then If more than a single <min,max> pair is specified then
ignore the 2nd and subsequent pairs. silently ignore the message.
Indicate message to be sent on private VC. Indicate message to be sent on private VC.
If (mar$flags.register == 1) then { If (mar$flags.register == 1) then {
If the node is already a registered member of the cluster If the node is already a registered member of the cluster
associated with protocol type then { /*previous register*/ associated with protocol type then { /*previous register*/
Copy the existing CMI into the MARS_JOIN. Copy the existing CMI into the MARS_JOIN.
} else { /* new register */ } else { /* new register */
Add the node to ClusterControlVC. Add the node to ClusterControlVC.
Add the node to cluster list. Add the node to cluster list.
mar$cmi = obtain CMI. mar$cmi = obtain CMI.
} /* new register */ } /* new register */
} else { /* not a register */ } else { /* not a register */
If the message source is in server map then { If the group is a duplicate of a previous MARS_JOIN then {
Drop the message silently. mar$msn = current csn.
Indicate message to be sent on Private VC.
} else {
Indicate no message to be sent. Indicate no message to be sent.
} else { If the message source is in server map then {
If the first <min,max> encompasses any group with Drop the message silently.
a server map then { } else {
Call the Modified JOIN/LEAVE Processing routine. If the first <min,max> encompasses any group with
Indicate no message to be sent. a server map then {
} else { /* server map does not exist */ Call the Modified JOIN/LEAVE Processing routine.
Update internal tables. } else {
Indicate message to be sent on ClusterControlVC. If the MARS_JOIN is for a multi group then {
} /* server map does not exist */ Call the MultiGroup JOIN/LEAVE Processing Routine.
} } else {
} /* not a register */ Indicate message to be sent on ClusterControlVC.
mar$flags.copy = 1. } /* not for a multi group */
Send message as indicated. } /* group not handled by server */
Return. } /* msg src not in server map */
Update internal tables.
} /* not a duplicate */
} /* not a register */
- MARS_LEAVE If a message exists then {
mar$flags.copy = 1.
Send message as indicated.
}
Return.
If (mar$flags.copy != 0) silently ignore the message. - MARS_LEAVE
Indicate message to be sent on ClusterControlVC.
If (mar$flags.register == 1) then { /* deregistration */ If (mar$flags.copy != 0) silently ignore the message.
Update internal tables to remove the member's ATM addr If more than a single <min,max> pair is specified then
from all groups it has joined. silently ignore the message.
Drop the endpoint from ClusterControlVC. Indicate message to be sent on ClusterControlVC.
Drop the endpoint from cluster list. If (mar$flags.register == 1) then { /* deregistration */
Release the CMI. Update internal tables to remove the member's ATM addr
Indicate message to be sent on Private VC. from all groups it has joined.
} else { /* not a deregistration */ Drop the endpoint from ClusterControlVC.
If the first <min,max> encompasses any group with Drop the endpoint from cluster list.
a server map then { Release the CMI.
Call the Modified JOIN/LEAVE Processing routine. Indicate message to be sent on Private VC.
} else { /* not a deregistration */
If the group is a duplicate of a previous MARS_LEAVE then {
mar$msn = current csn.
Indicate message to be sent on Private VC.
} else {
Indicate no message to be sent. Indicate no message to be sent.
} else { /* server map does not exist */ If the first <min,max> encompasses any group with
Update internal tables. a server map then {
Indicate message to be sent on ClusterControlVC. Call the Modified JOIN/LEAVE Processing routine.
} } else {
} /* not a deregistration */ If the MARS_LEAVE is for a multi group then {
If a message exists then { Call the MultiGroup JOIN/LEAVE Processing Routine.
mar$flags.copy = 1. } else {
Send message as indicated. Indicate message to be sent on ClusterControlVC.
} }
Return. }
Update internal tables.
} /* not a duplicate */
} /* not a deregistration */
If a message exists then {
mar$flags.copy = 1.
Send message as indicated.
}
Return.
- MARS_MSERV - MARS_MSERV
If (mar$flags.register == 1) then { /* server register */ If (mar$flags.register == 1) then { /* server register */
Add the endpoint as a leaf node to ServerControlVC. Add the endpoint as a leaf node to ServerControlVC.
Add the endpoint to the server list. Add the endpoint to the server list.
Indicate the message to be sent on Private VC. Indicate the message to be sent on Private VC.
mar$cmi = 0. mar$cmi = 0.
} else { /* not a register */ } else { /* not a register */
If the source has not registered then { If the source has not registered then {
Drop and ignore the message. Drop and ignore the message.
Indicate no message to be sent. Indicate no message to be sent.
} else { /* source is registered */ } else { /* source is registered */
Add the server ATM addr to server map for group. If MCS is already member of indicated server map {
Indicate the message to be sent on ServerControlVC. Indicate message to be sent on Private VC.
Send message as indicated. mar$flags.layer3grp = 0;
Make a copy of the message. mar$flags.copy = 1.
Indicate the message to be sent on ClusterControlVC. } else { /* New MCS to add. */
If new server map was just created { Add the server ATM addr to server map for group.
Indicate message to be sent on ServerControlVC.
Send message as indicated.
Make a copy of the message.
Indicate message to be sent on ClusterControlVC.
If new server map was just created {
Construct MARS_MIGRATE, with MCS as target. Construct MARS_MIGRATE, with MCS as target.
} else { } else {
Change the op code to MARS_JOIN. Change the op code to MARS_JOIN.
mar$flags.layer3grp = 0. mar$flags.layer3grp = 0.
mar$flags.copy = 1. mar$flags.copy = 1.
} /* new server map */ } /* new server map */
} /* New MCS to add. */
} /* source is registered */ } /* source is registered */
} /* not a register */ } /* not a register */
If a message exists then { If a message exists then {
Send message as indicated. Send message as indicated.
} }
Return. Return.
- MARS_UNSERV - MARS_UNSERV
If (mar$flags.register == 1) then { /* deregister */ If (mar$flags.register == 1) then { /* deregister */
Remove the ATM addr of the MCS from all server maps. Remove the ATM addr of the MCS from all server maps.
If a server map becomes null then delete it. If a server map becomes null then delete it.
Remove the endpoint as a leaf of ServerControlVC. Remove the endpoint as a leaf of ServerControlVC.
Remove the endpoint from server list. Remove the endpoint from server list.
Indicate the message to be sent on Private VC. Indicate the message to be sent on Private VC.
} else { /* not a deregister */ } else { /* not a deregister */
If the source is not a member of server list then { If the source is not a member of server list then {
Drop and ignore the message. Drop and ignore the message.
Indicate no message to be sent. Indicate no message to be sent.
} else { /* source is registered */ } else { /* source is registered */
Remove ATM addr of the MCS from each server map indicated. If MCS is not member of indicated server map {
If a server map is null then delete it. Indicate message to be sent on Private VC.
Indicate the message to be sent on ServerControlVC. mar$flags.layer3grp = 0;
Send message as indicated. mar$flags.copy = 1.
Make a copy of the message. } else { /* MCS existed, must be removed. */
Change the op code to MARS_LEAVE. Remove ATM addr of the MCS from indicated server map.
Indicate the message (copy) to be sent on ClusterControlVC. If a server map is null then delete it.
mar$flags.layer3grp = 0; Indicate the message to be sent on ServerControlVC.
mar$flags.copy = 1. Send message as indicated.
Make a copy of the message.
Change the op code to MARS_LEAVE.
Indicate message (copy) to be sent on ClusterControlVC.
mar$flags.layer3grp = 0;
mar$flags.copy = 1.
} /* MCS existed, must be removed. */
} /* source is registered */ } /* source is registered */
} /* not a deregister */ } /* not a deregister */
If a message exists then { If a message exists then {
Send message as indicated. Send message as indicated.
} }
Return. Return.
- MARS_NAK - MARS_NAK
Build command. Build command.
skipping to change at page 79, line 4 skipping to change at page 79, line 35
- MARS_NAK - MARS_NAK
Build command. Build command.
Return. Return.
- MARS_GROUPLIST_REQUEST - MARS_GROUPLIST_REQUEST
If (mar$pnum != 1) then Return. If (mar$pnum != 1) then Return.
Call MARS_GROUPLIST_REPLY with the range and output VC. Call MARS_GROUPLIST_REPLY with the range and output VC.
Return. Return.
- MARS_GROUPLIST_REPLY - MARS_GROUPLIST_REPLY
Build command for specified range. Build command for specified range.
Indicate message to be sent on specified VC. Indicate message to be sent on specified VC.
Send message as indicated. Send message as indicated.
Return. Return.
- MARS_REDIRECT_MAP - MARS_REDIRECT_MAP
Include the MARSs own address in the message. Include the MARSs own address in the message.
If there are backup MARSs then include their addresses. If there are backup MARSs then include their addresses.
Indicate MARS_REDIRECT_MAP is to be sent on ClusterControlVC. Indicate MARS_REDIRECT_MAP is to be sent on ClusterControlVC.
Send message back as indicated. Send message back as indicated.
Return. Return.
3. Send Message Handler 3. Send Message Handler
If the message is going out ClusterControlVC then { If (the message is going out ClusterControlVC) &&
(a new csn is required) then {
mar$msn = obtain a CSN mar$msn = obtain a CSN
} }
If the message is going out ServerControlVC then { If (the message is going out ServerControlVC) &&
(a new ssn is required) then {
mar$msn = obtain a SSN mar$msn = obtain a SSN
} }
Return. Return.
4. Number Generator 4. Number Generator
4.1 Cluster Sequence Number 4.1 Cluster Sequence Number
Generate the next sequence number. Generate the next sequence number.
Return. Return.
skipping to change at page 80, line 20 skipping to change at page 81, line 4
Make a copy of the message. Make a copy of the message.
Change the type of the copy to MARS_SJOIN. Change the type of the copy to MARS_SJOIN.
If the message is a MARS_LEAVE then { If the message is a MARS_LEAVE then {
Change the type of the copy to MARS_SLEAVE. Change the type of the copy to MARS_SLEAVE.
} }
mar$flags.copy = 1 (copy). mar$flags.copy = 1 (copy).
Indicate the message to be sent on ServerControlVC. Indicate the message to be sent on ServerControlVC.
Send message (copy) as indicated. Send message (copy) as indicated.
mar$flags.punched = 0 in the original message. mar$flags.punched = 0 in the original message.
Indicate the message to be sent on Private VC. Indicate the message to be sent on Private VC.
Send message (original) as indicated. Send message (original) as indicated.
Hole punch the <min,max> group by excluding Hole punch the <min,max> group by excluding
from the range those groups that are served by MCSs. from the range those groups that are served by MCSs
or which the joining (leaving) node is already
(still) a member of due to it having previously
issued a single group join.
Indicate the (original) message to be sent on ClusterControlVC. Indicate the (original) message to be sent on ClusterControlVC.
If (number of holes punched > 0) then { /* punched holes */ If (number of holes punched > 0) then { /* punched holes */
In original message do { In original message do {
mar$flags.punched = 1. mar$flags.punched = 1.
old punched list <- new punched list. old punched list <- new punched list.
} }
} /* punched holes */ } /* punched holes */
mar$flags.copy = 1. mar$flags.copy = 1.
Send message as indicated. Send message as indicated.
Return. Return.
5.1 MultiGroup JOIN/LEAVE Processing
This routine processes JOIN/LEAVE when a multi group exists.
If (mar$flags.layer3grp) {
Ignore this setting, consider it reset.
}
mar$flags.copy = 1.
Make a copy of the message.
From the copy hole punch the <min,max> group by
excluding from the range those groups that this
node has already joined or left.
If (number of holes punched > 0) then {
mar$flags.punch = 0 in original message.
Indicate original message to be sent on Private VC.
Send original message as indicated.
mar$flags.punch = 1 in copy message.
old group range <- new punched list.
Indicate message to be sent on ClusterControlVC.
Send copy of message as indicated.
} else {
Indicate message to be sent on ClusterControlVC.
Send original message as indicated.
} /* no holes punched */
Return.
 End of changes. 29 change blocks. 
108 lines changed or deleted 186 lines changed or added

This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/