static int DecodeMPLSTestHeaderTooSmall(void) { int ret = 1; /* A packet that is too small to have a complete MPLS header. */ uint8_t pkt[] = { 0x00, 0x00, 0x11 }; Packet *p = SCMalloc(SIZE_OF_PACKET); if (unlikely(p == NULL)) { return 0; } ThreadVars tv; DecodeThreadVars dtv; memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); if (!ENGINE_ISSET_EVENT(p, MPLS_HEADER_TOO_SMALL)) { ret = 0; } SCFree(p); return ret; }
static int DecodeMPLSTestPacketTooSmall(void) { ThreadVars tv; DecodeThreadVars dtv; memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); Packet *p0 = SCCalloc(1, SIZE_OF_PACKET); memset(p0, 0, SIZE_OF_PACKET); uint8_t pkt0[] = { 0x00, 0x01, 0x51, 0xff }; DecodeMPLS(&tv, &dtv, p0, pkt0, sizeof(pkt0), NULL); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p0, MPLS_PKT_TOO_SMALL)); SCFree(p0); Packet *p1 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p1); uint8_t pkt1[] = { 0x00, 0x01, 0x51, 0xff, 0x45 }; DecodeMPLS(&tv, &dtv, p1, pkt1, sizeof(pkt1), NULL); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p1, MPLS_PKT_TOO_SMALL)); SCFree(p1); Packet *p2 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p2); uint8_t pkt2[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01 }; DecodeMPLS(&tv, &dtv, p2, pkt2, sizeof(pkt2), NULL); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p2, MPLS_PKT_TOO_SMALL)); SCFree(p2); Packet *p3 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p3); uint8_t pkt3[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02 }; DecodeMPLS(&tv, &dtv, p3, pkt3, sizeof(pkt3), NULL); FAIL_IF_NOT(ENGINE_ISSET_EVENT(p3, MPLS_PKT_TOO_SMALL)); SCFree(p3); // This should not create a too small event is it has one more byte // than required. Packet *p4 = SCCalloc(1, SIZE_OF_PACKET); FAIL_IF_NULL(p4); uint8_t pkt4[] = { 0x00, 0x01, 0x51, 0xff, 0x45, 0x01, 0x02, 0x03 }; DecodeMPLS(&tv, &dtv, p4, pkt4, sizeof(pkt4), NULL); FAIL_IF(ENGINE_ISSET_EVENT(p4, MPLS_PKT_TOO_SMALL)); SCFree(p4); PASS; }
int DecodeEthernet(ThreadVars *tv, DecodeThreadVars *dtv, Packet *p, uint8_t *pkt, uint16_t len, PacketQueue *pq) { StatsIncr(tv, dtv->counter_eth); if (unlikely(len < ETHERNET_HEADER_LEN)) { ENGINE_SET_INVALID_EVENT(p, ETHERNET_PKT_TOO_SMALL); return TM_ECODE_FAILED; } p->ethh = (EthernetHdr *)pkt; if (unlikely(p->ethh == NULL)) return TM_ECODE_FAILED; SCLogDebug("p %p pkt %p ether type %04x", p, pkt, ntohs(p->ethh->eth_type)); switch (ntohs(p->ethh->eth_type)) { case ETHERNET_TYPE_IP: //printf("DecodeEthernet ip4\n"); DecodeIPV4(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, len - ETHERNET_HEADER_LEN, pq); break; case ETHERNET_TYPE_IPV6: //printf("DecodeEthernet ip6\n"); DecodeIPV6(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, len - ETHERNET_HEADER_LEN, pq); break; case ETHERNET_TYPE_PPPOE_SESS: //printf("DecodeEthernet PPPOE Session\n"); DecodePPPOESession(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, len - ETHERNET_HEADER_LEN, pq); break; case ETHERNET_TYPE_PPPOE_DISC: //printf("DecodeEthernet PPPOE Discovery\n"); DecodePPPOEDiscovery(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, len - ETHERNET_HEADER_LEN, pq); break; case ETHERNET_TYPE_VLAN: case ETHERNET_TYPE_8021QINQ: DecodeVLAN(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, len - ETHERNET_HEADER_LEN, pq); break; case ETHERNET_TYPE_MPLS_UNICAST: case ETHERNET_TYPE_MPLS_MULTICAST: DecodeMPLS(tv, dtv, p, pkt + ETHERNET_HEADER_LEN, len - ETHERNET_HEADER_LEN, pq); break; default: SCLogDebug("p %p pkt %p ether type %04x not supported", p, pkt, ntohs(p->ethh->eth_type)); } return TM_ECODE_OK; }
static int DecodeMPLSTestUnknownPayloadType(void) { int ret = 1; /* Valid label: 21. * Unknown payload type: 1. */ uint8_t pkt[] = { 0x00, 0x01, 0x51, 0xff, 0x15, 0x00, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a, 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01, 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd }; Packet *p = SCMalloc(SIZE_OF_PACKET); if (unlikely(p == NULL)) { return 0; } ThreadVars tv; DecodeThreadVars dtv; memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); if (!ENGINE_ISSET_EVENT(p, MPLS_UNKNOWN_PAYLOAD_TYPE)) { ret = 0; } SCFree(p); return ret; }
static int DecodeMPLSTestBadLabelReserved(void) { int ret = 1; uint8_t pkt[] = { 0x00, 0x00, 0x51, 0xff, 0x45, 0x00, 0x00, 0x64, 0x00, 0x0a, 0x00, 0x00, 0xff, 0x01, 0xa5, 0x6a, 0x0a, 0x01, 0x02, 0x01, 0x0a, 0x22, 0x00, 0x01, 0x08, 0x00, 0x3a, 0x77, 0x0a, 0x39, 0x06, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x33, 0x50, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd }; Packet *p = SCMalloc(SIZE_OF_PACKET); if (unlikely(p == NULL)) { return 0; } ThreadVars tv; DecodeThreadVars dtv; memset(&dtv, 0, sizeof(DecodeThreadVars)); memset(&tv, 0, sizeof(ThreadVars)); memset(p, 0, SIZE_OF_PACKET); DecodeMPLS(&tv, &dtv, p, pkt, sizeof(pkt), NULL); if (!ENGINE_ISSET_EVENT(p, MPLS_BAD_LABEL_RESERVED)) { ret = 0; } SCFree(p); return ret; }