1/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17syntax = "proto3";
18package android.net;
19
20// Used to indicate which call is invoked to send DNS lookups.
21enum CallType {
22    CALL_GETADDRINFO = 0;
23    CALL_GETHOSTBYNAME = 1;
24    CALL_GETHOSTBYADDR = 2;
25    CALL_GETNAMEINFO = 3;
26    CALL_RES_NSEND = 4;
27}
28
29// Values from bionic/libc/include/sys/socket.h
30enum AddressFamily {
31    option allow_alias = true;  // for AF_ROUTE = AF_NETLINK
32
33    GT_AF_UNSPEC = 0;
34    GT_AF_UNIX = 1;
35    GT_AF_LOCAL = 1;
36    GT_AF_INET = 2;
37    GT_AF_AX25 = 3;
38    GT_AF_IPX = 4;
39    GT_AF_APPLETALK = 5;
40    GT_AF_NETROM = 6;
41    GT_AF_BRIDGE = 7;
42    GT_AF_ATMPVC= 8;
43    GT_AF_X25 = 9;
44    GT_AF_INET6 = 10;
45    GT_AF_ROSE = 11;
46    GT_AF_DECnet = 12;
47    GT_AF_NETBEUI = 13;
48    GT_AF_SECURITY = 14;
49    GT_AF_KEY = 15;
50    GT_AF_NETLINK = 16;
51    GT_AF_ROUTE = 16;  // AF_NETLINK
52    GT_AF_PACKET = 17;
53    GT_AF_ASH = 18;
54    GT_AF_ECONET = 19;
55    GT_AF_ATMSVC = 20;
56    GT_AF_RDS = 21;
57    GT_AF_SNA = 22;
58    GT_AF_IRDA = 23;
59    GT_AF_PPPOX = 24;
60    GT_AF_WANPIPE = 25;
61    GT_AF_LLC = 26;
62    GT_AF_CAN = 29;
63    GT_AF_TIPC = 30;
64    GT_AF_BLUETOOTH = 31;
65    GT_AF_IUCV = 32;
66    GT_AF_RXRPC = 33;
67    GT_AF_ISDN = 34;
68    GT_AF_PHONET = 35;
69    GT_AF_IEEE802154 = 36;
70    GT_AF_CAIF = 37;
71    GT_AF_ALG = 38;
72    GT_AF_NFC = 39;
73    GT_AF_VSOCK = 40;
74    GT_AF_KCM = 41;
75    GT_AF_QIPCRTR = 42;
76    GT_AF_MAX = 43;
77}
78
79// Values from bionic/libc/include/sys/socket.h
80enum SocketType {
81    GT_SOCK_ANY = 0;  // See man getaddrinfo for more detail
82    GT_SOCK_STREAM = 1;
83    GT_SOCK_DGRAM = 2;
84    GT_SOCK_RAW = 3;
85    GT_SOCK_RDM = 4;
86    GT_SOCK_SEQPACKET = 5;
87    GT_SOCK_DCCP = 6;
88    GT_SOCK_PACKET = 10;
89}
90
91// Values from bionic/libc/kernel/uapi/linux/in.h
92enum ProtocolType {
93    GT_IPPROTO_IP = 0;
94    GT_IPPROTO_ICMP = 1;
95    GT_IPPROTO_IGMP = 2;
96    GT_IPPROTO_IPIP = 4;
97    GT_IPPROTO_TCP = 6;
98    GT_IPPROTO_EGP = 8;
99    GT_IPPROTO_PUP = 12;
100    GT_IPPROTO_UDP = 17;
101    GT_IPPROTO_IDP = 22;
102    GT_IPPROTO_TP = 29;
103    GT_IPPROTO_DCCP = 33;
104    GT_IPPROTO_IPV6 = 41;
105    GT_IPPROTO_RSVP = 46;
106    GT_IPPROTO_GRE = 47;
107    GT_IPPROTO_ESP = 50;
108    GT_IPPROTO_AH = 51;
109    GT_IPPROTO_MTP = 92;
110    GT_IPPROTO_BEETPH = 94;
111    GT_IPPROTO_ENCAP = 98;
112    GT_IPPROTO_PIM = 103;
113    GT_IPPROTO_COMP = 108;
114    GT_IPPROTO_SCTP = 132;
115    GT_IPPROTO_UDPLITE = 136;
116    GT_IPPROTO_MPLS = 137;
117    GT_IPPROTO_RAW = 255;
118    GT_IPPROTO_MAX = 256;
119}
120
121// The return value of the DNS resolver for each DNS lookups.
122// Values from bionic/libc/include/netdb.h
123// Values from system/netd/resolv/include/netd_resolv/resolv.h
124enum ReturnCodeType {
125    GT_EAI_NO_ERROR = 0;
126    GT_EAI_ADDRFAMILY = 1;
127    GT_EAI_AGAIN = 2;
128    GT_EAI_BADFLAGS = 3;
129    GT_EAI_FAIL = 4;
130    GT_EAI_FAMILY = 5;
131    GT_EAI_MEMORY = 6;
132    GT_EAI_NODATA = 7;
133    GT_EAI_NONAME = 8;
134    GT_EAI_SERVICE = 9;
135    GT_EAI_SOCKTYPE = 10;
136    GT_EAI_SYSTEM = 11;
137    GT_EAI_BADHINTS = 12;
138    GT_EAI_PROTOCOL = 13;
139    GT_EAI_OVERFLOW = 14;
140    GT_RESOLV_TIMEOUT = 255;
141    GT_EAI_MAX = 256;
142}
143
144// Describes the test configuration and expected result for gold test.
145// The unit test files a DNS query by the predefined |config|. Expect that the resolver sends the
146// query packet as the predefined packet in |packet_mapping.query|. When the DNS responser receives
147// the query packet, it returns the corresponding response packet from |packet_mapping.response|.
148// Finally, the unit test checks the return values if they are the same as |result|. Currently,
149// support getaddrinfo only.
150// TODO: Support gethostbyname, gethostbyaddr, and getnameinfo.
151message GoldTest {
152    // The configuration of various DNS query calls.
153    message Config {
154        // The arguments used to send a DNS query by call type CALL_GETADDRINFO.
155        message AddrInfo {
156            string host = 1;
157            AddressFamily family = 2;
158            SocketType socktype = 3;
159            ProtocolType protocol = 4;
160            int32 ai_flags = 5;
161        }
162
163        // The arguments used to send a DNS query by call type CALL_GETHOSTBYNAME.
164        message HostByName {
165            string host = 1;
166            AddressFamily family = 2;
167        }
168
169        // The call is used to send DNS lookups.
170        CallType call = 1;
171
172        // The arguments are used by the call.
173        oneof Arg {
174            // The arguments of call type CALL_GETADDRINFO.
175            AddrInfo addrinfo = 2;
176            HostByName hostbyname = 3;
177        }
178    };
179
180    // The result is expected in DNS lookups.
181    message Result {
182        ReturnCodeType return_code = 1;
183        repeated string addresses = 2;
184    };
185
186    // Describes how the DNS responser handles and responses the DNS lookup packets.
187    message PacketMapping {
188      bytes query = 1;
189      bytes response = 2;
190    }
191
192    // Configs used to send a DNS query via a DNS query API.
193    Config config = 1;
194
195    // Expected return values from DNS query API.
196    Result result = 2;
197
198    // Used to build the packet mapping (query, response) in DNS responser. See also
199    // addMappingBinaryPacket() in
200    // packages/modules/DnsResolver/tests/dns_responder/dns_responder.cpp.
201    repeated PacketMapping packet_mapping = 3;
202}
203