static bool test_get_ext_function_unsupported(void) { bool success = true; /* Init */ struct ipv6hdr *ip6_header; struct frag_hdr *fragment_hdr; struct ipv6_opt_hdr *esp_hdr, *routing_hdr; unsigned char *payload; ip6_header = kmalloc_packet(FRAG_HDR_LEN + OPT_HDR_LEN + ROUTING_HDR_LEN + 4, NEXTHDR_FRAGMENT); if (!ip6_header) return false; fragment_hdr = add_frag_hdr(ip6_header, sizeof(struct ipv6hdr), NEXTHDR_ESP); esp_hdr = add_opt_hdr(fragment_hdr, FRAG_HDR_LEN, FRAG_HDR_LEN); routing_hdr = add_routing_hdr(esp_hdr, OPT_HDR_LEN, NEXTHDR_UDP); payload = add_payload(routing_hdr, ROUTING_HDR_LEN); /* Test */ success &= assert_equals_ptr(fragment_hdr, get_extension_header(ip6_header, NEXTHDR_FRAGMENT), "Frag hdr"); success &= assert_equals_ptr(esp_hdr, get_extension_header(ip6_header, NEXTHDR_ESP), "ESP header"); success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_ROUTING), "Routing header"); /* The ESP header is in the way. */ success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_UDP), "Payload"); /* Same, but that isn't an extension header anyway. */ /* End */ kfree(ip6_header); return success; }
static bool test_get_ext_function_overflow(void) { bool success = true; /* Init */ struct ipv6hdr *ip6_header; struct frag_hdr *fragment_hdr; struct ipv6_opt_hdr *hop_by_hop_hdr; ip6_header = kmalloc_packet(FRAG_HDR_LEN + OPT_HDR_LEN, NEXTHDR_FRAGMENT); if (!ip6_header) return false; fragment_hdr = add_frag_hdr(ip6_header, sizeof(struct ipv6hdr), NEXTHDR_HOP); hop_by_hop_hdr = add_opt_hdr(fragment_hdr, FRAG_HDR_LEN, NEXTHDR_ROUTING); /* Test */ success &= assert_equals_ptr(fragment_hdr, get_extension_header(ip6_header, NEXTHDR_FRAGMENT), "Frag hdr"); success &= assert_equals_ptr(hop_by_hop_hdr, get_extension_header(ip6_header, NEXTHDR_HOP), "Hop-by-hop hdr"); success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_UDP), "Payload"); /* The UDP header is not an extension header. */ /* End */ kfree(ip6_header); return success; }
static bool test_get_ext_function_no_subheaders(void) { bool success = true; /* Init */ struct ipv6hdr *ip6_header; unsigned char *payload; ip6_header = kmalloc_packet(4, NEXTHDR_UDP); if (!ip6_header) return false; payload = add_payload(ip6_header, sizeof(struct ipv6hdr)); /* Test */ success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_FRAGMENT), "Frag hdr"); success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_HOP), "Hop-by-hop hdr"); success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_ESP), "ESP hdr"); success &= assert_equals_ptr(NULL, get_extension_header(ip6_header, NEXTHDR_UDP), "Payload"); /* The UDP header is not an extension header. */ /* End */ kfree(ip6_header); return success; }
static bool test_next_function_subheaders(void) { bool success = true; struct hdr_iterator iterator; /* Init */ struct ipv6hdr *ip6_header; struct frag_hdr *fragment_hdr; struct ipv6_opt_hdr *hop_by_hop_hdr; struct ipv6_opt_hdr *routing_hdr; unsigned char *payload; ip6_header = kmalloc_packet(FRAG_HDR_LEN + OPT_HDR_LEN + ROUTING_HDR_LEN + 4, NEXTHDR_FRAGMENT); if (!ip6_header) return false; fragment_hdr = add_frag_hdr(ip6_header, sizeof(struct ipv6hdr), NEXTHDR_HOP); hop_by_hop_hdr = add_opt_hdr(fragment_hdr, FRAG_HDR_LEN, NEXTHDR_ROUTING); routing_hdr = add_routing_hdr(hop_by_hop_hdr, OPT_HDR_LEN, NEXTHDR_UDP); payload = add_payload(routing_hdr, ROUTING_HDR_LEN); /* Test */ hdr_iterator_init(&iterator, ip6_header); success &= assert_equals_ptr(fragment_hdr, iterator.data, "Frag hdr, data"); success &= assert_equals_u8(NEXTHDR_FRAGMENT, iterator.hdr_type, "Frag hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_SUCCESS, hdr_iterator_next(&iterator), "Next 1"); success &= assert_equals_ptr(hop_by_hop_hdr, iterator.data, "Hop-by-hop hdr, data"); success &= assert_equals_u8(NEXTHDR_HOP, iterator.hdr_type, "Hop-by-hop hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_SUCCESS, hdr_iterator_next(&iterator), "Next 2"); success &= assert_equals_ptr(routing_hdr, iterator.data, "Routing hdr, data"); success &= assert_equals_u8(NEXTHDR_ROUTING, iterator.hdr_type, "Routing hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_SUCCESS, hdr_iterator_next(&iterator), "Next 3"); success &= assert_equals_ptr(payload, iterator.data, "Payload 1, data"); success &= assert_equals_u8(NEXTHDR_UDP, iterator.hdr_type, "Payload 1, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_END, hdr_iterator_next(&iterator), "Next 4"); success &= assert_equals_ptr(payload, iterator.data, "Payload 2, data"); success &= assert_equals_u8(NEXTHDR_UDP, iterator.hdr_type, "Payload 2, type"); /* Fall through. */ end: kfree(ip6_header); return success; }
static bool test_last_function_unsupported(void) { bool success = true; struct hdr_iterator iterator; /* Init */ struct ipv6hdr *ip6_header; struct frag_hdr *fragment_hdr; struct ipv6_opt_hdr *esp_hdr; struct ipv6_opt_hdr *routing_hdr; unsigned char *payload; ip6_header = kmalloc_packet(FRAG_HDR_LEN + OPT_HDR_LEN + ROUTING_HDR_LEN + 4, NEXTHDR_FRAGMENT); if (!ip6_header) return false; fragment_hdr = add_frag_hdr(ip6_header, sizeof(struct ipv6hdr), NEXTHDR_ESP); esp_hdr = add_opt_hdr(fragment_hdr, FRAG_HDR_LEN, FRAG_HDR_LEN); routing_hdr = add_routing_hdr(esp_hdr, OPT_HDR_LEN, NEXTHDR_UDP); payload = add_payload(routing_hdr, ROUTING_HDR_LEN); /* Test */ hdr_iterator_init(&iterator, ip6_header); success &= assert_equals_int(HDR_ITERATOR_UNSUPPORTED, hdr_iterator_last(&iterator), "Result"); success &= assert_equals_ptr(esp_hdr, iterator.data, "Last function, data"); success &= assert_equals_u8(NEXTHDR_ESP, iterator.hdr_type, "Last function, type"); /* End */ kfree(ip6_header); return success; }
static bool test_next_function_unsupported(void) { bool success = true; struct hdr_iterator iterator; /* Init */ struct ipv6hdr *ip6_header; struct frag_hdr *fragment_hdr; struct ipv6_opt_hdr *esp_hdr; struct ipv6_opt_hdr *routing_hdr; unsigned char *payload; ip6_header = kmalloc_packet(FRAG_HDR_LEN + OPT_HDR_LEN + ROUTING_HDR_LEN + 4, NEXTHDR_FRAGMENT); if (!ip6_header) return false; fragment_hdr = add_frag_hdr(ip6_header, sizeof(struct ipv6hdr), NEXTHDR_ESP); esp_hdr = add_opt_hdr(fragment_hdr, FRAG_HDR_LEN, FRAG_HDR_LEN); routing_hdr = add_routing_hdr(esp_hdr, OPT_HDR_LEN, NEXTHDR_UDP); payload = add_payload(routing_hdr, ROUTING_HDR_LEN); /* Test */ hdr_iterator_init(&iterator, ip6_header); success &= assert_equals_ptr(fragment_hdr, iterator.data, "Frag hdr, pointer"); success &= assert_equals_u8(NEXTHDR_FRAGMENT, iterator.hdr_type, "Frag hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_SUCCESS, hdr_iterator_next(&iterator), "Next 1"); success &= assert_equals_ptr(esp_hdr, iterator.data, "ESP hdr, pointer"); success &= assert_equals_u8(NEXTHDR_ESP, iterator.hdr_type, "ESP hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_UNSUPPORTED, hdr_iterator_next(&iterator), "Next 2"); success &= assert_equals_ptr(esp_hdr, iterator.data, "Still ESP header, pointer"); success &= assert_equals_u8(NEXTHDR_ESP, iterator.hdr_type, "Still ESP header, type"); /* Fall through. */ end: kfree(ip6_header); return success; }
static bool test_next_function_no_subheaders(void) { bool success = true; struct hdr_iterator iterator; /* Init */ struct ipv6hdr *ip6_header; unsigned char *payload; ip6_header = kmalloc_packet(4, NEXTHDR_UDP); if (!ip6_header) return false; payload = add_payload(ip6_header, sizeof(struct ipv6hdr)); /* Test */ hdr_iterator_init(&iterator, ip6_header); success &= assert_equals_ptr(payload, iterator.data, "Payload 1, data"); success &= assert_equals_u8(NEXTHDR_UDP, iterator.hdr_type, "Payload 1, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_END, hdr_iterator_next(&iterator), "Result 1"); success &= assert_equals_ptr(payload, iterator.data, "Payload 2, data"); success &= assert_equals_u8(NEXTHDR_UDP, iterator.hdr_type, "Payload 2, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_END, hdr_iterator_next(&iterator), "Result 2"); success &= assert_equals_int(HDR_ITERATOR_END, hdr_iterator_next(&iterator), "Result 3"); success &= assert_equals_int(HDR_ITERATOR_END, hdr_iterator_next(&iterator), "Result 4"); success &= assert_equals_ptr(payload, iterator.data, "Payload 3, data"); success &= assert_equals_u8(NEXTHDR_UDP, iterator.hdr_type, "Payload 3, type"); /* Fall through. */ end: kfree(ip6_header); return success; }
static bool test_inner_packet_validation4(void) { struct sk_buff *skb = NULL; bool result = true; /* Internally call the function to evaluate -> skb_init_cb_ipv4(skb) */ skb = create_skb4(100, create_skb4_icmp_error); result &= assert_not_equals_ptr(NULL, skb, "validate complete inner pkt 4"); if (skb) kfree_skb(skb); skb = create_skb4(30, create_skb4_icmp_error); result &= assert_equals_ptr(NULL, skb, "validate incomplete tcp inner pkt 4"); if (skb) kfree_skb(skb); skb = create_skb4(15, create_skb4_icmp_error); result &= assert_equals_ptr(NULL, skb, "validate incomplete ipv4hdr inner pkt 4"); if (skb) kfree_skb(skb); return result; }
static bool test_next_function_overflow(void) { bool success = true; struct hdr_iterator iterator; /* Init */ struct ipv6hdr *ip6_header; struct frag_hdr *fragment_hdr; struct ipv6_opt_hdr *hop_by_hop_hdr; ip6_header = kmalloc_packet(FRAG_HDR_LEN + OPT_HDR_LEN, NEXTHDR_FRAGMENT); if (!ip6_header) return false; fragment_hdr = add_frag_hdr(ip6_header, sizeof(struct ipv6hdr), NEXTHDR_HOP); hop_by_hop_hdr = add_opt_hdr(fragment_hdr, FRAG_HDR_LEN, NEXTHDR_ROUTING); /* Test */ hdr_iterator_init(&iterator, ip6_header); success &= assert_equals_ptr(fragment_hdr, iterator.data, "Frag hdr, data"); success &= assert_equals_u8(NEXTHDR_FRAGMENT, iterator.hdr_type, "Frag hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_SUCCESS, hdr_iterator_next(&iterator), "Next 1"); success &= assert_equals_ptr(hop_by_hop_hdr, iterator.data, "Hop-by-hop hdr, data"); success &= assert_equals_u8(NEXTHDR_HOP, iterator.hdr_type, "Hop-by-hop hdr, type"); if (!success) goto end; success &= assert_equals_int(HDR_ITERATOR_OVERFLOW, hdr_iterator_next(&iterator), "Next 2"); /* Fall through. */ end: kfree(ip6_header); return success; }
static bool test_last_function_no_subheaders(void) { bool success = true; struct hdr_iterator iterator; /* Init */ struct ipv6hdr *ip6_header; unsigned char *payload; ip6_header = kmalloc_packet(4, NEXTHDR_UDP); if (!ip6_header) return false; payload = add_payload(ip6_header, sizeof(struct ipv6hdr)); /* Test */ hdr_iterator_init(&iterator, ip6_header); success &= assert_equals_int(HDR_ITERATOR_END, hdr_iterator_last(&iterator), "Result"); success &= assert_equals_ptr(payload, iterator.data, "Last function, data"); success &= assert_equals_u8(NEXTHDR_UDP, iterator.hdr_type, "Last function, type"); /* End */ kfree(ip6_header); return success; }
bool assert_null(void *actual, char *test_name) { return assert_equals_ptr(NULL, actual, test_name); }