/*++ Copyright (c) 1998-2000 Microsoft Corporation Module Name: rfc.h Abstract: Structures and constants from the IP/1394 RFC 2734, which can be found at: http://www.ietf.org/rfc/rfc2734.txt Revision History: Who When What -------- -------- ---- josephj 03-28-99 created, based on draft version 14. --*/ #pragma pack (push, 1) // ARP request/response pkt, including the unfragmented encapsulation header. // typedef struct _IP1394_ARP_PKT { NIC1394_UNFRAGMENTED_HEADER header; // hardware_type is a constant that identifies IEEE1394. This field must be set // to IP1394_HARDWARE_TYPE, defined below. This field must be byte-swapped // before the packet is sent out over the wire. // USHORT hardware_type; #define IP1394_HARDWARE_TYPE 0x0018 // protocol_type is a constant that identifies this ARP packet as being an // IPV4 ARP packet. This field must be set to IP1394_PROTOCOL_TYPE, defined // below. This field must be byte-swapped before the packet is sent out over the // wire. // USHORT protocol_type; #define IP1394_PROTOCOL_TYPE 0x0800 // hw_addr_len is the size (in octets) of the senders hw address, which // consists of the following: // sender_unique_ID (8 bytes) // sender_maxrec (1 byte) // sspd (1 byte) // sender_unicast_FIFO_hi (2 bytes) // sender_unicast_FIFO_lo (4 bytes) // This field must be set to IP1394_HW_ADDR_LEN, defined below. // UCHAR hw_addr_len; #define IP1394_HW_ADDR_LEN 16 // IP_addr_len is the size of the IP address field. It must be set to // sizeof (ULONG). // UCHAR IP_addr_len; // opcode should be set to either IP1394_ARP_REQUEST (for ARP request packets) // or to IP1394_ARP_RESPONSE (for ARP response packets). Both constants are // defined below. This field must be byte-swapped before the packet is sent out // over the wire. // USHORT opcode; #define IP1394_ARP_REQUEST 1 #define IP1394_ARP_RESPONSE 2 // // The following 5 fields constitute the sender's hardware address. // // sender_unique_ID is the sender's unique ID, in network byte order. // UINT64 sender_unique_ID; // sender_maxrec is the value of max_rec in the sender's configuration ROM // bus information block. The following formula converts from max_rec to // size in bytes (from "FireWire System Architecture", 1st ed, pp 225 (or look // for max_rec in the index)): // size = 2^(max_rec+1) // The minimum value of max_rec is 0x1. // The maximun value of max_rec is 0xD. // // The macros immediately below may be used to convert from max_rec to // bytes, and to verify that max_rec is within the valid range. // UCHAR sender_maxrec; #define IP1394_MAXREC_TO_SIZE(_max_rec) (2 << ((_max_rec)+1)) #define IP1394_IS_VALID_MAXREC(_max_rec) ((_max_rec)>0 && (_max_rec)<0xE) // sspd encodes "sender speed", which is the lesser of the sender's link speed // and the PHY speed. ssped must be set to one of the IP1394_SSPD_* constants, // defined below. // UCHAR sspd; #define IP1394_SSPD_S100 0 #define IP1394_SSPD_S200 1 #define IP1394_SSPD_S400 2 #define IP1394_SSPD_S800 3 #define IP1394_SSPD_S1600 4 #define IP1394_SSPD_S3200 5 #define IP1394_IS_VALID_SSPD(_sspd) ((_sspd)<=5) // sender_unicast_FIFO_hi is the high 16-bits of the sender's 48-bit FIFO // address offset, in network byte order. // USHORT sender_unicast_FIFO_hi; // sender_unicast_FIFO_lo is the low 32-bits of the sender's 48-bit FIFO // address offset, in network byte order. // ULONG sender_unicast_FIFO_lo; // sender_IP_address is the sender's IP address, in network byte order. // ULONG sender_IP_address; // target_IP_address is the target's IP address, in network byte order. // This field is ignored if opcode is set to IP1394_ARP_RESPONSE // ULONG target_IP_address; } IP1394_ARP_PKT, *PIP1394_ARP_PKT; // MCAP group descriptor format (one or more per MCAP packet) // typedef struct _IP1394_MCAP_GD { // size, in octets, of this descriptor. // UCHAR length; // Type of descriptor. One of the IP1394_MCAP_GD_TYPE_* values below // UCHAR type; #define IP1394_MCAP_GD_TYPE_V1 1 // IP multicast MCAP Ver 1. // Reserved // USHORT reserved; // Expiration (TTL) in seconds // UCHAR expiration; // Channel number // UCHAR channel; // Speed code. // UCHAR speed; // Reserved // UCHAR reserved2; // Bandwidth (unused) // ULONG bandwidth; // IP multicast group address // (In theory it could be of arbitrary length, computed by // looking at the "length" field above. However for our purposes // (type==1) we expect the group_address size to be 4. // ULONG group_address; } IP1394_MCAP_GD, *PIP1394_MCAP_GD; // MCAP message format, including the unfragmented encapsulation header. // typedef struct _IP1394_MCAP_PKT { NIC1394_UNFRAGMENTED_HEADER header; // size, in octets, of the entire MCAP message (NOT including the // encapsulation header). // USHORT length; // Reserved // UCHAR reserved; // Opcode -- one of the IP1394_MCAP_OP* values below. // UCHAR opcode; #define IP1394_MCAP_OP_ADVERTISE 0 #define IP1394_MCAP_OP_SOLICIT 1 // zero or more group address descriptors // IP1394_MCAP_GD group_descriptors[1]; } IP1394_MCAP_PKT, *PIP1394_MCAP_PKT; /* RFC NOTES and COMMENTS 1. No max channel expiery. Min expiery is 60sec Extracts from the RFC re MCAP: speed: This field is valid only for advertise messages, in which case it SHALL specify the speed at which stream packets for the indicated channel are transmitted. Table 2 specifies the encoding used for speed. A recipient of an MCAP message SHALL examine the most significant ten bits of source_ID from the GASP header; if they are not equal to either 0x3FF or the most significant ten bits of the recipient's NODE_IDS register, the recipient SHALL IGNORE the message. Subsequent to sending a solicitation request, the originator SHALL NOT send another MCAP solicitation request until ten seconds have elapsed. If no MCAP advertise message is received for a particular group address within ten seconds, no multicast source(s) are active for channel(s) other than the default. Either there is there is no multicast data or it is being transmitted on the default channel. Once 100 ms elapses subsequent to the initial advertisement of a newly allocated channel number , the multicast source may transmit IP datagrams using the channel number advertised. Except when a channel owner intends to relinquish ownership (as described in 9.7 below), the expiration time SHALL be at least 60 seconds in the future measured from the time the advertisement is transmitted. No more than ten seconds SHALL elapse from the transmission of its most recent advertisement before the owner of a channel mapping initiates transmission of the subsequent advertisement. The owner of a channel mapping SHOULD transmit an MCAP advertisement in response to a solicitation as soon as possible after the receipt of the request. MCAP advertisements whose expiration field has a value less than 60 SHALL be ignored for the purpose of overlapped channel detection. The channel numbers advertised by owners with smaller physical IDs are invalid; their owners SHALL cease transmission of both IP datagrams and MCAP advertisements that use the invalid channel numbers. As soon as these channel mappings expire , their owners SHALL deallocate any unused channel numbers as described in 9.8 below. If the original owner observes an MCAP advertisement for the channel to be relinquished before its own timer has expired, it SHALL NOT deallocate the channel number. If the intended owner of the channel mapping observes an MCAP advertisement whose expiration field is zero, orderly transfer of the channel(s) from the former owner has failed. A channel mapping expires when expiration seconds have elapsed since the most recent MCAP advertisement. At this time, multicast recipients SHALL stop reception on the expired channel number(s). Also at this time, the owner of the channel mapping(s) SHALL transmit an MCAP advertisement with expiration cleared to zero and SHALL continue to transmit such advertisements until 30 seconds have elapsed since the expiration of the channel mapping. If an IP-capable device observes an MCAP advertisement whose expiration field is zero, it SHALL NOT attempt to allocate any of the channel number(s) specified until 30 seconds have elapsed since the most recent such advertisement. 9.10 Bus reset A bus reset SHALL invalidate all multicast channel mappings and SHALL cause all multicast recipients and senders to zero all MCAP advertisement interval timers. Intended or prior recipients or transmitters of multicast on other than the default channel SHALL NOT transmit MCAP solicitation requests until at least ten seconds have elapsed since the completion of the bus reset. Multicast data on other than the default channel SHALL NOT be received or transmitted until an MCAP advertisement is observed or transmitted for the IP multicast group address. Intended or prior transmitters of multicast on other than the default channel that did not own a channel mapping for the IP multicast group address prior to the bus reset SHALL NOT attempt to allocate a channel number from the isochronous resource manager's CHANNELS_AVAILABLE register until at least ten seconds have elapsed since the completion of the bus reset. */ #pragma pack (pop)