Line data Source code
1 : /* 2 : * Copyright (c) 2015 Cisco and/or its affiliates. 3 : * Licensed under the Apache License, Version 2.0 (the "License"); 4 : * you may not use this file except in compliance with the License. 5 : * You may obtain a copy of the License at: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 9 : * Unless required by applicable law or agreed to in writing, software 10 : * distributed under the License is distributed on an "AS IS" BASIS, 11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : * See the License for the specific language governing permissions and 13 : * limitations under the License. 14 : */ 15 : #ifndef __included_ipfix_packet_h__ 16 : #define __included_ipfix_packet_h__ 17 : 18 : #include <vnet/ipfix-export/ipfix_info_elements.h> 19 : 20 : /* From RFC-7011: 21 : * https://tools.ietf.org/html/rfc7011 22 : */ 23 : 24 : typedef struct 25 : { 26 : u32 version_length; 27 : u32 export_time; 28 : u32 sequence_number; 29 : u32 domain_id; 30 : } ipfix_message_header_t; 31 : 32 : static inline u32 33 131 : version_length (u16 length) 34 : { 35 131 : return clib_host_to_net_u32 (0x000a0000 | length); 36 : } 37 : 38 : 39 : /* 40 : * The Field Specifier format is shown in Figure G. 41 : * 42 : * 0 1 2 3 43 : * 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 44 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 45 : * |E| Information Element ident. | Field Length | 46 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 47 : * | Enterprise Number | 48 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 49 : * 50 : * Figure G: Field Specifier Format 51 : * 52 : * Where: 53 : * 54 : * E 55 : * 56 : * Enterprise bit. This is the first bit of the Field Specifier. If 57 : * this bit is zero, the Information Element identifier identifies an 58 : * Information Element in [IANA-IPFIX], and the four-octet Enterprise 59 : * Number field MUST NOT be present. If this bit is one, the 60 : * Information Element identifier identifies an enterprise-specific 61 : * Information Element, and the Enterprise Number field MUST be 62 : * present. 63 : */ 64 : 65 : typedef struct 66 : { 67 : u32 e_id_length; 68 : u32 enterprise; 69 : } ipfix_enterprise_field_specifier_t; 70 : 71 : typedef struct 72 : { 73 : u32 e_id_length; 74 : } ipfix_field_specifier_t; 75 : 76 : static inline u32 77 870 : ipfix_e_id_length (int e, u16 id, u16 length) 78 : { 79 : u32 value; 80 870 : value = (e << 31) | ((id & 0x7FFF) << 16) | length; 81 870 : return clib_host_to_net_u32 (value); 82 : } 83 : 84 : /* 85 : * Every Set contains a common header. This header is defined in 86 : * Figure I. 87 : * 88 : * 0 1 2 3 89 : * 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 90 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 91 : * | Set ID | Length | 92 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 93 : * 94 : * Figure I: Set Header Format 95 : * 96 : * Each Set Header field is exported in network format. The fields are 97 : * defined as follows: 98 : * 99 : * Set ID 100 : * 101 : * Identifies the Set. A value of 2 is reserved for Template Sets. 102 : * A value of 3 is reserved for Options Template Sets. Values from 4 103 : * to 255 are reserved for future use. Values 256 and above are used 104 : * for Data Sets. The Set ID values of 0 and 1 are not used, for 105 : * historical reasons [RFC3954]. 106 : * 107 : * Length 108 : * 109 : * Total length of the Set, in octets, including the Set Header, all 110 : * records, and the optional padding. Because an individual Set MAY 111 : * contain multiple records, the Length value MUST be used to 112 : * determine the position of the next Set. 113 : */ 114 : 115 : typedef struct 116 : { 117 : u32 set_id_length; 118 : } ipfix_set_header_t; 119 : 120 : static inline u32 121 131 : ipfix_set_id_length (u16 set_id, u16 length) 122 : { 123 131 : return clib_host_to_net_u32 ((set_id << 16) | length); 124 : } 125 : 126 : /* 127 : * The format of the Template Record is shown in Figure J. It consists 128 : * of a Template Record Header and one or more Field Specifiers. Field 129 : * Specifiers are defined in Figure G above. 130 : * 131 : * +--------------------------------------------------+ 132 : * | Template Record Header | 133 : * +--------------------------------------------------+ 134 : * | Field Specifier | 135 : * +--------------------------------------------------+ 136 : * | Field Specifier | 137 : * +--------------------------------------------------+ 138 : * ... 139 : * +--------------------------------------------------+ 140 : * | Field Specifier | 141 : * +--------------------------------------------------+ 142 : * 143 : * Figure J: Template Record Format 144 : * 145 : * The format of the Template Record Header is shown in Figure K. 146 : * 147 : * 0 1 2 3 148 : * 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 149 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 150 : * | Template ID (> 255) | Field Count | 151 : * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 152 : * 153 : * Figure K: Template Record Header Format 154 : * 155 : * The Template Record Header Field definitions are as follows: 156 : * 157 : * Template ID 158 : * 159 : * Each Template Record is given a unique Template ID in the range 160 : * 256 to 65535. This uniqueness is local to the Transport Session 161 : * and Observation Domain that generated the Template ID. Since 162 : * Template IDs are used as Set IDs in the Sets they describe (see 163 : * Section 3.4.3), values 0-255 are reserved for special Set types 164 : * (e.g., Template Sets themselves), and Templates and Options 165 : * Templates (see Section 3.4.2) cannot share Template IDs within a 166 : * Transport Session and Observation Domain. There are no 167 : * constraints regarding the order of the Template ID allocation. As 168 : * Exporting Processes are free to allocate Template IDs as they see 169 : * fit, Collecting Processes MUST NOT assume incremental Template 170 : * IDs, or anything about the contents of a Template based on its 171 : * Template ID alone. 172 : * 173 : * Field Count 174 : * 175 : * Number of fields in this Template Record. 176 : */ 177 : 178 : typedef struct 179 : { 180 : u32 id_count; 181 : } ipfix_template_header_t; 182 : 183 : static inline u32 184 83 : ipfix_id_count (u16 id, u16 count) 185 : { 186 83 : return clib_host_to_net_u32 ((id << 16) | count); 187 : } 188 : 189 : /* Template packet */ 190 : typedef struct 191 : { 192 : ipfix_message_header_t h; 193 : ipfix_set_header_t s; 194 : ipfix_template_header_t t; 195 : ipfix_field_specifier_t fields[0]; 196 : } ipfix_template_packet_t; 197 : 198 : #endif /* __included_ipfix_packet_h__ */ 199 : 200 : /* 201 : * fd.io coding-style-patch-verification: ON 202 : * 203 : * Local Variables: 204 : * eval: (c-set-style "gnu") 205 : * End: 206 : */