int rfc6052_4to6(struct pool6 *pool, struct in_addr *addr4, struct in6_addr *result) { struct ipv6_prefix prefix; int error; error = pool6_peek(pool, &prefix); if (error) return error; return addr_4to6(addr4, &prefix, result); }
static int create_session_ipv4(struct tuple *tuple4, struct bib_entry *bib, struct session_entry **session) { struct ipv6_prefix prefix; struct in6_addr ipv6_src; struct tuple tuple6; int error; error = pool6_peek(&prefix); if (error) return error; error = addr_4to6(&tuple4->src.addr4.l3, &prefix, &ipv6_src); if (error) { log_debug("Error code %d while translating the packet's address.", error); return error; } /* * Fortunately, ICMP errors cannot reach this code because of the requirements in the header * of section 3.5, so we can use the tuple as shortcuts for the packet's fields. */ if (bib) tuple6.src.addr6 = bib->ipv6; else memset(&tuple6.src.addr6, 0, sizeof(tuple6.src.addr6)); tuple6.dst.addr6.l3 = ipv6_src; tuple6.dst.addr6.l4 = tuple4->src.addr4.l4; *session = session_create(&tuple6.src.addr6, &tuple6.dst.addr6, &tuple4->dst.addr4, &tuple4->src.addr4, tuple4->l4_proto, bib); if (!(*session)) { log_debug("Failed to allocate a session entry."); return -ENOMEM; } apply_policies(); return 0; }