| < 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/ | ||||