32 #define MPLS_HEADER_LEN 4
34 #define MPLS_MAX_RESERVED_LABEL 15
36 #define MPLS_LABEL_IPV4 0
37 #define MPLS_LABEL_ROUTER_ALERT 1
38 #define MPLS_LABEL_IPV6 2
39 #define MPLS_LABEL_NULL 3
41 #define MPLS_LABEL(shim) SCNtohl(shim) >> 12
42 #define MPLS_BOTTOM(shim) ((SCNtohl(shim) >> 8) & 0x1)
45 #define MPLS_PROTO_ETHERNET_PW 0
46 #define MPLS_PROTO_IPV4 4
47 #define MPLS_PROTO_IPV6 6
50 const uint8_t *pkt, uint32_t
len)
60 if (!PacketIncreaseCheckLayers(
p)) {
68 memcpy(&shim, pkt,
sizeof(shim));
75 if (
len > USHRT_MAX) {
107 switch (pkt[0] >> 4) {
109 if (
len > USHRT_MAX) {
134 static int DecodeMPLSTestHeaderTooSmall(
void)
155 static int DecodeMPLSTestPacketTooSmall(
void)
164 uint8_t pkt0[] = { 0x00, 0x01, 0x51, 0xff };
171 uint8_t pkt1[] = { 0x00, 0x01, 0x51, 0xff, 0x45 };
178 uint8_t pkt2[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01 };
185 uint8_t pkt3[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02 };
194 uint8_t pkt4[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02, 0x03 };
202 static int DecodeMPLSTestBadLabelRouterAlert(
void)
205 0x00, 0x00, 0x11, 0xff, 0x45, 0x00, 0x00, 0x64,
206 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
207 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
208 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
210 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
211 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
212 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
213 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
214 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
215 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
216 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
217 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd
235 static int DecodeMPLSTestBadLabelImplicitNull(
void)
238 0x00, 0x00, 0x31, 0xff, 0x45, 0x00, 0x00, 0x64,
239 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
240 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
241 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
242 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
243 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
244 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
245 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
246 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
247 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
248 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
249 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
250 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd
267 static int DecodeMPLSTestBadLabelReserved(
void)
270 0x00, 0x00, 0x51, 0xff, 0x45, 0x00, 0x00, 0x64,
271 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
272 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
273 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
274 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
275 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
276 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
277 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
278 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
279 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
280 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
281 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
282 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd
299 static int DecodeMPLSTestUnknownPayloadType(
void)
305 0x00, 0x01, 0x51, 0xff, 0x15, 0x00, 0x00, 0x64,
306 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
307 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
308 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
309 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
310 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
311 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
312 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
313 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
314 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
315 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
316 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
317 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd
340 DecodeMPLSTestHeaderTooSmall);
342 DecodeMPLSTestPacketTooSmall);
344 DecodeMPLSTestBadLabelRouterAlert);
346 DecodeMPLSTestBadLabelImplicitNull);
348 DecodeMPLSTestBadLabelReserved);
350 DecodeMPLSTestUnknownPayloadType);