31 #define MPLS_HEADER_LEN 4
33 #define MPLS_MAX_RESERVED_LABEL 15
35 #define MPLS_LABEL_IPV4 0
36 #define MPLS_LABEL_ROUTER_ALERT 1
37 #define MPLS_LABEL_IPV6 2
38 #define MPLS_LABEL_NULL 3
40 #define MPLS_LABEL(shim) SCNtohl(shim) >> 12
41 #define MPLS_BOTTOM(shim) ((SCNtohl(shim) >> 8) & 0x1)
44 #define MPLS_PROTO_ETHERNET_PW 0
45 #define MPLS_PROTO_IPV4 4
46 #define MPLS_PROTO_IPV6 6
49 const uint8_t *pkt, uint32_t
len)
59 if (!PacketIncreaseCheckLayers(
p)) {
67 memcpy(&shim, pkt,
sizeof(shim));
74 if (
len > USHRT_MAX) {
106 switch (pkt[0] >> 4) {
108 if (
len > USHRT_MAX) {
133 static int DecodeMPLSTestHeaderTooSmall(
void)
154 static int DecodeMPLSTestPacketTooSmall(
void)
163 uint8_t pkt0[] = { 0x00, 0x01, 0x51, 0xff };
170 uint8_t pkt1[] = { 0x00, 0x01, 0x51, 0xff, 0x45 };
177 uint8_t pkt2[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01 };
184 uint8_t pkt3[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02 };
193 uint8_t pkt4[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02, 0x03 };
201 static int DecodeMPLSTestBadLabelRouterAlert(
void)
204 0x00, 0x00, 0x11, 0xff, 0x45, 0x00, 0x00, 0x64,
205 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
206 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
207 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
208 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
209 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
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
234 static int DecodeMPLSTestBadLabelImplicitNull(
void)
237 0x00, 0x00, 0x31, 0xff, 0x45, 0x00, 0x00, 0x64,
238 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
239 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
240 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
242 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
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
266 static int DecodeMPLSTestBadLabelReserved(
void)
269 0x00, 0x00, 0x51, 0xff, 0x45, 0x00, 0x00, 0x64,
270 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
271 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
272 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
274 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
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
298 static int DecodeMPLSTestUnknownPayloadType(
void)
304 0x00, 0x01, 0x51, 0xff, 0x15, 0x00, 0x00, 0x64,
305 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a,
306 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01,
307 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b,
308 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50,
309 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd,
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
339 DecodeMPLSTestHeaderTooSmall);
341 DecodeMPLSTestPacketTooSmall);
343 DecodeMPLSTestBadLabelRouterAlert);
345 DecodeMPLSTestBadLabelImplicitNull);
347 DecodeMPLSTestBadLabelReserved);
349 DecodeMPLSTestUnknownPayloadType);