1 /* $NetBSD: getaddrinfo.c,v 1.82 2006/03/25 12:09:40 rpaulo Exp $ */ 2 /* $KAME: getaddrinfo.c,v 1.29 2000/08/31 17:26:57 itojun Exp $ */ 3 /* 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the project nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 */ 32 33 /* 34 * This is an adaptation of Android's implementation of RFC 6724 35 * (in Android's getaddrinfo.c). It has some cosmetic differences 36 * from Android's getaddrinfo.c, but Android's getaddrinfo.c was 37 * used as a guide or example of a way to implement the RFC 6724 spec when 38 * this was written. 39 */ 40 41 #ifndef ADDRESS_SORTING_H 42 #define ADDRESS_SORTING_H 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 typedef struct address_sorting_address { 49 char addr[128]; 50 size_t len; 51 } address_sorting_address; 52 53 /* address_sorting_sortable represents one entry in a list of destination 54 * IP addresses to sort. It contains the destination IP address 55 * "sorting key", along with placeholder and scratch fields. */ 56 typedef struct address_sorting_sortable { 57 // input data; sorting key 58 address_sorting_address dest_addr; 59 // input data; optional value to attach to the sorting key 60 void* user_data; 61 // internal fields, these must be zero'd when passed to sort function 62 address_sorting_address source_addr; 63 bool source_addr_exists; 64 size_t original_index; 65 } address_sorting_sortable; 66 67 void address_sorting_rfc_6724_sort(address_sorting_sortable* sortables, 68 size_t sortables_len); 69 70 void address_sorting_init(); 71 void address_sorting_shutdown(); 72 73 struct address_sorting_source_addr_factory; 74 75 /* The interfaces below are exposed only for testing */ 76 typedef struct { 77 /* Gets the source address that would be used for the passed-in destination 78 * address, and fills in *source_addr* with it if one exists. 79 * Returns true if a source address exists for the destination address, 80 * and false otherwise. */ 81 bool (*get_source_addr)(struct address_sorting_source_addr_factory* factory, 82 const address_sorting_address* dest_addr, 83 address_sorting_address* source_addr); 84 void (*destroy)(struct address_sorting_source_addr_factory* factory); 85 } address_sorting_source_addr_factory_vtable; 86 87 typedef struct address_sorting_source_addr_factory { 88 const address_sorting_source_addr_factory_vtable* vtable; 89 } address_sorting_source_addr_factory; 90 91 /* Platform-compatible address family types */ 92 typedef enum { 93 ADDRESS_SORTING_AF_INET, 94 ADDRESS_SORTING_AF_INET6, 95 ADDRESS_SORTING_UNKNOWN_FAMILY, 96 } address_sorting_family; 97 98 /* Indicates whether the address is AF_INET, AF_INET6, or another address 99 * family. */ 100 address_sorting_family address_sorting_abstract_get_family( 101 const address_sorting_address* address); 102 103 void address_sorting_override_source_addr_factory_for_testing( 104 address_sorting_source_addr_factory* factory); 105 106 bool address_sorting_get_source_addr_for_testing( 107 const address_sorting_address* dest, address_sorting_address* source); 108 109 #ifdef __cplusplus 110 } 111 #endif 112 113 #endif // ADDRESS_SORTING_H 114