static bool test_4to6(l4_protocol l4_proto) { struct tuple incoming, outgoing; bool success = true; incoming.src.addr.ipv4 = remote_ipv4; incoming.dst.addr.ipv4 = local_ipv4; incoming.src.l4_id = 123; /* Whatever */ incoming.dst.l4_id = 80; /* Lookup will use this. */ incoming.l3_proto = L3PROTO_IPV4; incoming.l4_proto = l4_proto; if (l4_proto != L4PROTO_ICMP) { success &= assert_equals_int(VER_CONTINUE, tuple5(&incoming, &outgoing), "Function5 call"); success &= assert_equals_u16(123, outgoing.src.l4_id, "Source port"); success &= assert_equals_u16(1500, outgoing.dst.l4_id, "Destination port"); } else { success &= assert_equals_int(VER_CONTINUE, tuple3(&incoming, &outgoing), "Function3 call"); success &= assert_equals_u16(1500, outgoing.icmp_id, "ICMP ID"); } success &= assert_equals_ipv6(&local_ipv6, &outgoing.src.addr.ipv6, "Source address"); success &= assert_equals_ipv6(&remote_ipv6, &outgoing.dst.addr.ipv6, "Destination address"); success &= assert_equals_u16(L3PROTO_IPV6, outgoing.l3_proto, "Layer-3 protocol"); success &= assert_equals_u8(l4_proto, outgoing.l4_proto, "Layer-4 protocol"); return success; }
bool validate_ipv6_hdr(struct ipv6hdr *hdr, u16 payload_len, u8 nexthdr, struct tuple *tuple6) { bool success = true; success &= assert_equals_u8(6, hdr->version, "IPv6hdr-version"); success &= assert_equals_u8(0, hdr->priority, "IPv6hdr-priority"); success &= assert_equals_u8(0, hdr->flow_lbl[0], "IPv6hdr-flow lbl[0]"); success &= assert_equals_u8(0, hdr->flow_lbl[1], "IPv6hdr-flow lbl[1]"); success &= assert_equals_u8(0, hdr->flow_lbl[2], "IPv6hdr-flow lbl[2]"); success &= assert_equals_u16(payload_len, be16_to_cpu(hdr->payload_len), "IPv6hdr-payload len"); success &= assert_equals_u8(nexthdr, hdr->nexthdr, "IPv6hdr-nexthdr"); /* success &= assert_equals_u8(, hdr->hop_limit, "IPv6hdr-hop limit"); */ success &= assert_equals_ipv6(&tuple6->src.addr6.l3, &hdr->saddr, "IPv6hdr-src address"); success &= assert_equals_ipv6(&tuple6->dst.addr6.l3, &hdr->daddr, "IPv6hdr-dst address"); return success; }
bool test_addr_4to6(struct in_addr *src, struct ipv6_prefix *prefix, struct in6_addr *expected) { struct in6_addr actual; bool success = true; success &= assert_true(addr_4to6(src, prefix, &actual), "Append IPv4-result"); success &= assert_equals_ipv6(expected, &actual, "Append IPv4-out."); return success; }
static bool test_4to6(bool (*function)(struct tuple *, struct tuple *), u_int8_t in_l4_protocol, u_int8_t out_l4_protocol) { struct tuple incoming, outgoing; bool success = true; incoming.src.addr.ipv4 = remote_ipv4; incoming.dst.addr.ipv4 = local_ipv4; incoming.src.l4_id = 123; // Whatever incoming.dst.l4_id = 80; // Lookup will use this. incoming.l3_proto = PF_INET; incoming.l4_proto = in_l4_protocol; success &= assert_true(function(&incoming, &outgoing), "Function call"); success &= assert_equals_ipv6(&local_ipv6, &outgoing.src.addr.ipv6, "Source address"); success &= assert_equals_ipv6(&remote_ipv6, &outgoing.dst.addr.ipv6, "Destination address"); success &= assert_equals_u16(PF_INET6, outgoing.l3_proto, "Layer-3 protocol"); success &= assert_equals_u8(out_l4_protocol, outgoing.l4_proto, "Layer-4 protocol"); // TODO (test) need to test ports? return success; }
bool test_transport_address_ipv6( void ) { struct in6_addr addr6; struct ipv6_tuple_address ta; bool success = true; /* Build an IPv6 transport address from address & port */ if (!str_to_addr6_verbose(IPV6_TRANSPORT_ADDR, &addr6)) return false; transport_address_ipv6( addr6, IPV6_TRANSPORT_PORT, &ta ); success &= assert_equals_ipv6(&ta.address, &addr6 , "Check that the address part of an IPv6 transport address is correct."); success &= assert_equals_u16( ta.l4_id, IPV6_TRANSPORT_PORT , "Check that the port part of an IPv6 transport address is correct."); return success; }
bool test_embed_ipv4_in_ipv6( void ) { struct in_addr embeddable4; struct in6_addr embed6; struct in6_addr embedded6; bool success = true; if (pool6_init(NULL, 9) != 0) return false; success &= str_to_addr4_verbose(IPV4_EMBEDDABLE_ADDR, &embeddable4); success &= str_to_addr6_verbose(IPV6_EMBEDDED_ADDR, &embedded6); success &= assert_true(append_ipv4( &embeddable4, &embed6 ) , "Check that we can embed an IPv4 address inside of an IPv6 address correctly."); success &= assert_equals_ipv6( &embed6 , &embedded6 , "Verify that the IPv4 was embedded into a IPv6 address is correct."); return success; }