| /* |
| * Copyright (c) 2015 Cisco and/or its affiliates. |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| #ifndef __included_ipfix_packet_h__ |
| #define __included_ipfix_packet_h__ |
| |
| #include <vnet/ipfix-export/ipfix_info_elements.h> |
| |
| /* From RFC-7011: |
| * https://tools.ietf.org/html/rfc7011 |
| */ |
| |
| typedef struct |
| { |
| u32 version_length; |
| u32 export_time; |
| u32 sequence_number; |
| u32 domain_id; |
| } ipfix_message_header_t; |
| |
| static inline u32 |
| version_length (u16 length) |
| { |
| return clib_host_to_net_u32 (0x000a0000 | length); |
| } |
| |
| |
| /* |
| * The Field Specifier format is shown in Figure G. |
| * |
| * 0 1 2 3 |
| * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * |E| Information Element ident. | Field Length | |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * | Enterprise Number | |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * |
| * Figure G: Field Specifier Format |
| * |
| * Where: |
| * |
| * E |
| * |
| * Enterprise bit. This is the first bit of the Field Specifier. If |
| * this bit is zero, the Information Element identifier identifies an |
| * Information Element in [IANA-IPFIX], and the four-octet Enterprise |
| * Number field MUST NOT be present. If this bit is one, the |
| * Information Element identifier identifies an enterprise-specific |
| * Information Element, and the Enterprise Number field MUST be |
| * present. |
| */ |
| |
| typedef struct |
| { |
| u32 e_id_length; |
| u32 enterprise; |
| } ipfix_enterprise_field_specifier_t; |
| |
| typedef struct |
| { |
| u32 e_id_length; |
| } ipfix_field_specifier_t; |
| |
| static inline u32 |
| ipfix_e_id_length (int e, u16 id, u16 length) |
| { |
| u32 value; |
| value = (e << 31) | ((id & 0x7FFF) << 16) | length; |
| return clib_host_to_net_u32 (value); |
| } |
| |
| /* |
| * Every Set contains a common header. This header is defined in |
| * Figure I. |
| * |
| * 0 1 2 3 |
| * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * | Set ID | Length | |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * |
| * Figure I: Set Header Format |
| * |
| * Each Set Header field is exported in network format. The fields are |
| * defined as follows: |
| * |
| * Set ID |
| * |
| * Identifies the Set. A value of 2 is reserved for Template Sets. |
| * A value of 3 is reserved for Options Template Sets. Values from 4 |
| * to 255 are reserved for future use. Values 256 and above are used |
| * for Data Sets. The Set ID values of 0 and 1 are not used, for |
| * historical reasons [RFC3954]. |
| * |
| * Length |
| * |
| * Total length of the Set, in octets, including the Set Header, all |
| * records, and the optional padding. Because an individual Set MAY |
| * contain multiple records, the Length value MUST be used to |
| * determine the position of the next Set. |
| */ |
| |
| typedef struct |
| { |
| u32 set_id_length; |
| } ipfix_set_header_t; |
| |
| static inline u32 |
| ipfix_set_id_length (u16 set_id, u16 length) |
| { |
| return clib_host_to_net_u32 ((set_id << 16) | length); |
| } |
| |
| /* |
| * The format of the Template Record is shown in Figure J. It consists |
| * of a Template Record Header and one or more Field Specifiers. Field |
| * Specifiers are defined in Figure G above. |
| * |
| * +--------------------------------------------------+ |
| * | Template Record Header | |
| * +--------------------------------------------------+ |
| * | Field Specifier | |
| * +--------------------------------------------------+ |
| * | Field Specifier | |
| * +--------------------------------------------------+ |
| * ... |
| * +--------------------------------------------------+ |
| * | Field Specifier | |
| * +--------------------------------------------------+ |
| * |
| * Figure J: Template Record Format |
| * |
| * The format of the Template Record Header is shown in Figure K. |
| * |
| * 0 1 2 3 |
| * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * | Template ID (> 255) | Field Count | |
| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
| * |
| * Figure K: Template Record Header Format |
| * |
| * The Template Record Header Field definitions are as follows: |
| * |
| * Template ID |
| * |
| * Each Template Record is given a unique Template ID in the range |
| * 256 to 65535. This uniqueness is local to the Transport Session |
| * and Observation Domain that generated the Template ID. Since |
| * Template IDs are used as Set IDs in the Sets they describe (see |
| * Section 3.4.3), values 0-255 are reserved for special Set types |
| * (e.g., Template Sets themselves), and Templates and Options |
| * Templates (see Section 3.4.2) cannot share Template IDs within a |
| * Transport Session and Observation Domain. There are no |
| * constraints regarding the order of the Template ID allocation. As |
| * Exporting Processes are free to allocate Template IDs as they see |
| * fit, Collecting Processes MUST NOT assume incremental Template |
| * IDs, or anything about the contents of a Template based on its |
| * Template ID alone. |
| * |
| * Field Count |
| * |
| * Number of fields in this Template Record. |
| */ |
| |
| typedef struct |
| { |
| u32 id_count; |
| } ipfix_template_header_t; |
| |
| static inline u32 |
| ipfix_id_count (u16 id, u16 count) |
| { |
| return clib_host_to_net_u32 ((id << 16) | count); |
| } |
| |
| /* Template packet */ |
| typedef struct |
| { |
| ipfix_message_header_t h; |
| ipfix_set_header_t s; |
| ipfix_template_header_t t; |
| ipfix_field_specifier_t fields[0]; |
| } ipfix_template_packet_t; |
| |
| #endif /* __included_ipfix_packet_h__ */ |
| |
| /* |
| * fd.io coding-style-patch-verification: ON |
| * |
| * Local Variables: |
| * eval: (c-set-style "gnu") |
| * End: |
| */ |