This chapter specifies the syntax and semantics for some shared definitions.
The syntax for some shared definitions is shown below.
<Letter> ::= 'a' | 'b' | 'c' | ... | 'z' | 'A' | 'B' | 'C' | ... | 'Z' <Ascii char> ::= 'a' | 'b' | 'c' | ... | 'z' | 'A' | 'B' | 'C' | ... | 'Z' | '0' | ... | '9' | ' ' | '.' | '(' | ')' | '{' | '}' | '[' | ']' | ',' | ';' | '=' | '<' | '>' | '!' | '_' | '-' <Ascii char reduced> ::= 'a' | 'b' | 'c' | ... | 'z' | 'A' | 'B' | 'C' | ... | 'Z' | '0' | ... | '9' | '_' | '-' <Number> ::= '0' | '1' | ... | '9'
<Identifier> ::= <Letter> { <Ascii char reduced> }
<NtplId> ::= <32-bit value> <Priority> ::= '0' | '1' | '2' | ... | '62' <FrameLengthValue> ::= '0' | '1' | '2' | ... | 10000 | '0x0' | '0x1' | '0x2' | ... | '0x2710' <TrueFalseValue> ::= 'TRUE' | 'FALSE'
<StreamIdSpec> ::= <StreamIdSetSpec> | <StreamIdRangeSpec> | 'DROP' <StreamIdSetSpec> ::= <StreamId> [ ',' <StreamIdSetSpec> ] - Up to 32 StreamIDs <StreamIdRangeSpec> ::= '(' <StreamId> '..' <StreamId> ')' <StreamId> ::= '0' | '1' | '2' | ... | '255'
<PortNumberSpec> ::= <PortNumberSetSpec> | <PortNumberRangeSpec> <PortNumberSetSpec> ::= <PortNumber> [ ',' <PortNumberSetSpec> ] - Up to 8 port numbers <PortNumberRangeSpec> ::= '(' <PortNumber> '..' <PortNumber> ')' <PortNumber> ::= '0' | '1' | '2' | ... | '31'
<Number32BitSpec> ::= <Number32BitSetSpec> | <Number32BitRangeSpec> <Number32BitSetSpec> ::= <Number32Bit> [ ',' <Number32BitSetSpec> ] <Number32BitRangeSpec> ::= '(' <Number32Bit> '..' <Number32Bit> ')' <Number32Bit> ::= '0' | '1' | '2' | ... | '4294967295'
<MaskNumber> ::= '0' | '1' | '2' | ... | '15' <KeySetId> ::= '1' | '2' | ... | '15'
<EqualNotEqualTest> ::= '==' | '!=' <CompareOperator> ::= '==' | '!=' | '<' | '<=' | '>' | '>='
<IPv4AddrValue> ::= '[' <8-bit decimal value> '.' <8-bit decimal value> '.' <8-bit decimal value> '.' <8-bit decimal value> ']' <IPv4AddrMask> ::= '[' <8-bit hex value> '.' <8-bit hex value> '.' <8-bit hex value> '.' <8-bit hex value> ']' | '[' <8-bit hex value without 0x> '.' <8-bit hex value without 0x> '.' <8-bit hex value without 0x> '.' <8-bit hex value without 0x> ']' <IPv6AddrValue> ::= '[' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ']' | '[' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ']' <IPv6AddrMask> ::= '[' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ':' <16-bit hex value> ']' | '[' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ':' <16-bit hex value without 0x> ']'
<ProtocolField> ::= <ProtocolField8> | <ProtocolField11> | <ProtocolField15> <ProtocolField8> ::= <Identifier> | <ProtocolLocation8> '/' <Number>) <ProtocolField11> ::= <Identifier> | <ProtocolLocation11> '/' <Number>) <ProtocolField15> ::= <Identifier> | <ProtocolLocation15> '/' <Number>) <ProtocolLocation8> ::= <ProtocolOffset> '[' <8-bit signed value> ']' <ProtocolLocation11> ::= <ProtocolOffset> '[' <11-bit signed value> ']' <ProtocolLocation15> ::= <ProtocolOffset> '[' <15-bit signed value> ']' <ProtocolOffset> ::= 'StartOfFrame' | 'Layer2Header' | 'FirstVLAN' | 'FirstMPLS' | 'Layer3Header' | 'IdentificationField' | 'DestinationIp' | 'Layer4Header' | 'Layer4Payload' | 'TunnelPayload' | 'InnerLayer2Header' | 'InnerFirstVLAN' | 'InnerFirstMPLS' | 'InnerLayer3Header' | 'InnerIdentificationField' | 'InnerDestinationIp' | 'InnerLayer4Header' | 'InnerLayer4Payload' | 'EndOfFrame' | 'Layer3PayloadEnd' | 'InnerLayer3PayloadEnd'
<8-bit signed value> ::= '-128' | '-127' | ... | '-1' | '0' | '1' | ... | '127' <8-bit value> ::= <8-bit hex value> | <8-bit decimal value> <8-bit hex value> ::= '0x00' | '0x01' | '0x02' | ... | '0xFF' <8-bit hex value without 0x> ::= '00' | '01' | '02' | ... | 'FF' <8-bit decimal value> ::= '0' | '1' | '2' | ... | '255' <11-bit signed value> ::= '-1024' | '-1023' | ... | '-1' | '0' | '1' | ... | '1024' <15-bit signed value> ::= '-16384' | '-16383' | ... | '-1' | '0' | '1' | ... | '16383' <16-bit value> ::= <16-bit hex value> | <16-bit decimal value> <16-bit hex value> ::= '0x0000' | '0x0001' | ... | '0xFFFF' <16-bit hex value without 0x> ::= '0000' | '0001' | ... | 'FFFF' <16-bit decimal value> ::= '0' | '1' | '2' | ... | '65535' <32-bit value> ::= <32-bit hex value> | <32-bit decimal value> <32-bit hex value> ::= '0x00000000' | '0x00000001' | ... | '0xFFFFFFFF' <32-bit hex value witout 0x> ::= '00000000' | '00000001' | ... | 'FFFFFFFF' <32-bit decimal value> ::= '0' | '1' | '2' | ... | '4294967295' <HexString> ::= '0x' <HexDigitSpec> <HexDigitList> ::= <HexDigit> [ <HexDigitSpec> ] <HexDigit> ::= '0' | '1' | '2' | ... | '9' | 'A' | 'B' | ... | 'F' <BinaryString> ::= ''b' <BinaryDigitSpec> <BinaryDigitSpec> ::= <BinaryDigit> [ <BinaryDigitSpec> ] <BinaryDigit> ::= '0' | '1' <DescriptorLength> ::= '16' | '18' | '20' | ... | '64' <DeduplicationGroupNumber> ::= '0' | '1' | ... | '15' <MaskLength> ::= '1' | '2' | ... | '16'
A 'ProtocolField' is a range of bytes in a packet. It is specified by a starting point and a number of bits (in practice a multiplum of 8). E.g. 'Layer3Header[12]/32' specifies the source IP address in an IPv4 packet.
'ProtocolLocation' takes two parameters, a dynamic part - 'ProtocolOffset' and a static offset. E.g. Layer2Header[4] means 4 bytes into the layer 2 header.
'ProtocolOffset' is a symbolic reference to a particular offset in a packet. The actual value will be calculated at runtime. This is why this is often referred to as the dynamic offset.
Dynamic Offsets
Offset | Points to |
---|---|
StartOfFrame | Start of the frame |
Layer2Header | Start of the Layer 2 header, i.e. the DMAC field |
FirstVLAN | First VLAN |
FirstMPLS | First MPLS |
Layer3Header | Start of the Layer 3 header |
IdentificationField | IPv4/v6 Identification field |
DestinationIp | IPv4/v6 destination IP address |
Layer4Header | Start of the Layer 4 header |
Layer4Payload | First byte of the Layer 4 payload |
Layer3PayloadEnd | After last byte of Layer 3 payload |
EndOfFrame | After the frame |
TunnelPayload | First byte of the tunnelled data |
InnerLayer2Header | Start of the tunnelled Layer 2 header |
InnerFirstVLAN | First tunnelled VLAN |
InnerFirstMPLS | First MPLS header |
InnerLayer3Header | Start of the tunnelled Layer 3 header |
InnerIdentificationField | First tunnelled IPv4/v6 Identification field |
InnerDestinationIp | First tunnelled IPv4/v6 destination IP address |
InnerLayer4Header | Start of the tunnelled Layer 4 header |
InnerLayer4Payload | First byte of the tunnelled Layer 4 payload |
InnerLayer3PayloadEnd | After the last byte of the Layer 3 payload |
If the dynamic offsets refers to a field that is not present in the packet, the offset is still well-defined and points to the location where it would have otherwise have been. For example, if MPLS headers are present, 'FirstMPLS' will point to the first MPLS header, otherwise it will point to the 'Layer3Header' offset instead.