1 /*
2  * Copyright (C) 2021-2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef OHOS_DHCP_CLIENT_DEF_H
16 #define OHOS_DHCP_CLIENT_DEF_H
17 
18 #include <stdbool.h>
19 #include <stdint.h>
20 #include <netinet/udp.h>
21 #include <netinet/ip.h>
22 #include <string>
23 
24 #define DHCP_GET_TIMEOUT        15
25 #define MAXRETRYTIMEOUT         10
26 #define USECOND_CONVERT         1000
27 #define MAX_READ_EVENT_SIZE     512
28 #define NUMBER_ONE              1
29 #define NUMBER_TWO              2
30 #define NUMBER_THREE            3
31 #define NUMBER_FOUR             4
32 #define NUMBER_FIVE             5
33 #define NUMBER_FIFTY_FOUR       54
34 #define FIRST_TIMEOUT_SEC       1
35 #define MAX_TIMEOUT_SEC         6
36 #define DOUBLE_TIME             2
37 #define RENEWAL_SEC_MULTIPLE    0.5
38 #define REBIND_SEC_MULTIPLE     0.875
39 #define TIME_INTERVAL_MAX       1
40 #define TIMEOUT_TIMES_MAX       15
41 #define MAX_WAIT_TIMES          5
42 #define TIMEOUT_WAIT_SEC        1
43 #define TIMEOUT_MORE_WAIT_SEC   60
44 #define ONE_HOURS_SEC           3600
45 #define LEASETIME_DEFAULT       1
46 #define SLEEP_TIME_200_MS       (200 * 1000)
47 #define SLEEP_TIME_500_MS       (500 * 1000)
48 #define DHCP_FAILE_TIMEOUT_THR  6
49 #define MAX_CONFLICTS_COUNT     2
50 #define SELECT_TIMEOUT_US       100000
51 
52 #define MAC_ADDR_LEN            6
53 #define MAC_ADDR_CHAR_NUM       3
54 #define ETHERNET_TYPE           0x01
55 #define ETHERNET_LEN            6
56 #define VENDOR_MAX_LEN          64
57 #define MAGIC_COOKIE            0x63825363
58 #define BROADCAST_FLAG          0x8000
59 #define MAC_BCAST_ADDR          "\xff\xff\xff\xff\xff\xff"
60 #define SIGNED_INTEGER_MAX      0x7FFFFFFF
61 #define PID_MAX_LEN             16
62 #define DEFAULT_UMASK           027
63 #define DIR_MAX_LEN             256
64 #define INFNAME_SIZE            16    /* Length of interface name */
65 #define RWMODE                  0600
66 #define MAX_MSG_SIZE            1500
67 #define DHCP_FILE_MAX_BYTES     128
68 #define STRING_MAX_LEN          1024
69 #define EVENT_GET_IPV4          "usual.event.wifi.dhcp.GET_IPV4"
70 
71 /* UDP port numbers for BOOTP */
72 #define BOOTP_SERVER            67
73 #define BOOTP_CLIENT            68
74 
75 /* BOOTP message type */
76 #define BOOT_REQUEST            1
77 #define BOOT_REPLY              2
78 
79 /* DHCP packet type */
80 #define DHCP_DISCOVER           1
81 #define DHCP_OFFER              2
82 #define DHCP_REQUEST            3
83 #define DHCP_DECLINE            4
84 #define DHCP_ACK                5
85 #define DHCP_NAK                6
86 #define DHCP_RELEASE            7
87 #define DHCP_INFORM             8
88 #define DHCP_FORCERENEW         9
89 
90 /* Sizes for DhcpPacket Fields */
91 #define DHCP_HWADDR_LENGTH          16
92 #define DHCP_HOST_NAME_LENGTH       64
93 #define DHCP_BOOT_FILE_LENGTH       128
94 #define DHCP_OPT_SIZE               1780
95 #define DHCP_OPT_CODE_INDEX         0
96 #define DHCP_OPT_LEN_INDEX          1
97 #define DHCP_OPT_DATA_INDEX         2
98 #define DHCP_OPT_CODE_BYTES         1
99 #define DHCP_OPT_LEN_BYTES          1
100 #define DHCP_UINT8_BYTES            1
101 #define DHCP_UINT16_BYTES           2
102 #define DHCP_UINT32_BYTES           4
103 #define DHCP_UINT32_DOUBLE_BYTES    8
104 #define DHCP_UINT16_BITS            16
105 #define DHCP_REQ_CODE_NUM           12
106 #define OPTION_FIELD                0
107 #define FILE_FIELD                  1
108 #define SNAME_FIELD                 2
109 #define DHCP_DNS_FIRST              1
110 #define DHCP_DNS_SECOND             2
111 
112 #ifdef OHOS_EUPDATER
113 #define WORKDIR                 "/tmp/service/el1/public/dhcp/"
114 #else
115 #define WORKDIR                 "/data/service/el1/public/dhcp/"
116 #endif // OHOS_EUPDATER
117 
118 #define DHCPC_NAME              "dhcp_client_service"
119 #define DHCPC_CONF              "dhcp_client_service.conf"
120 #define DHCPC_PID               "dhcp_client_service.pid"
121 #define DHCPC_VERSION           "1.0"
122 #define DHCPC_LEASE             "dhcp_client_service-%s.lease"
123 #define DHCP_CACHE_FILE         WORKDIR"/dhcp_cache.conf"
124 /* netmanager ipv6 */
125 constexpr int DHCP_IPV6_ENABLE = 1;
126 constexpr int DHCP_IPV6_DISENABLE = 0;
127 
128 /* dhcp action mode */
129 enum ActionMode {
130     ACTION_START_NEW = 0,
131     ACTION_START_OLD,
132     ACTION_RENEW_T1,
133     ACTION_RENEW_T2,
134     ACTION_RENEW_T3,
135     ACTION_INVALID
136 };
137 
138 /* dhcp signal mode */
139 enum SigMode {
140     SIG_START = 0,
141     SIG_STOP,
142     SIG_RENEW,
143     SIG_INVALID
144 };
145 
146 /* dhcp state code */
147 enum EnumDhcpStateCode {
148     DHCP_STATE_INIT = 0,
149     DHCP_STATE_SELECTING,
150     DHCP_STATE_REQUESTING,
151     DHCP_STATE_BOUND,
152     DHCP_STATE_RENEWING,
153     DHCP_STATE_REBINDING,
154     DHCP_STATE_INITREBOOT,
155     DHCP_STATE_RELEASED,
156     DHCP_STATE_RENEWED,
157     DHCP_STATE_FAST_ARP,
158     DHCP_STATE_SLOW_ARP,
159     DHCP_STATE_DECLINE,
160 };
161 
162 /* dhcp return code */
163 enum EnumErrCode {
164     DHCP_OPT_SUCCESS = 0,  /* success */
165     DHCP_OPT_FAILED,       /* failed */
166     DHCP_OPT_NULL,        /* null pointer */
167     DHCP_OPT_TIMEOUT,     /* timeout */
168     DHCP_OPT_ERROR,       /* error */
169     DHCP_OPT_NOT_SUPPORTED, /* not supported */
170     DHCP_OPT_NONE,        /* none */
171 };
172 
173 /* socket return code */
174 enum EnumSocketErrCode {
175     SOCKET_OPT_SUCCESS = 0,
176     SOCKET_OPT_FAILED = -1,
177     SOCKET_OPT_ERROR = -2
178 };
179 
180 /* socket mode */
181 enum EnumSocketMode {
182     SOCKET_MODE_INVALID        = 0,
183     SOCKET_MODE_RAW            = 1,
184     SOCKET_MODE_KERNEL         = 2
185 };
186 
187 // See: RFC 2132        DHCP Options and BOOTP Vendor Extensions      March 1997
188 enum DhcpOptions {
189     /*
190      * 3. RFC 1497 Vendor Extensions
191      * This section lists the vendor extensions as defined in RFC 1497.
192      * They are defined here for completeness.
193      */
194     PAD_OPTION = 0,
195     END_OPTION = 255,
196 
197     SUBNET_MASK_OPTION = 1,
198     TIME_OFFSET_OPTION = 2,
199     ROUTER_OPTION = 3,
200     TIME_SERVER_OPTION = 4,
201     NAME_SERVER_OPTION = 5,
202     DOMAIN_NAME_SERVER_OPTION = 6,
203     LOG_SERVER_OPTION = 7,
204     COOKIE_SERVER_OPTION = 8,
205     LPR_SERVER_OPTION = 9,
206     IMPRESS_SERVER_OPTION = 10,
207     RESOURCE_LOCATION_SERVER_OPTION = 11,
208     HOST_NAME_OPTION = 12,
209     BOOT_FILE_SIZE_OPTION = 13,
210     MERIT_DUMP_FILE_OPTION = 14,
211     DOMAIN_NAME_OPTION = 15,
212     SWAP_SERVER_OPTION = 16,
213     ROOT_PATH_OPTION = 17,
214     EXTENSIONS_PATH_OPTION = 18,
215 
216     /*
217      * IP Layer Parameters per Host
218      * This section details the options that affect the operation of the IP layer on a per-host basis.
219      */
220     IP_FORWARDING_OPTION = 19,
221     NON_LOCAL_SOURCE_ROUTING_OPTION = 20,
222     POLICY_FILTER_OPTION = 21,
223     MAXIMUM_DATAGRAM_REASSEMBLY_SIZE_OPTION = 22,
224     DEFAULT_IP_TIME_TO_LIVE_OPTION = 23,
225     PATH_MTU_AGING_TIMEOUT_OPTION = 24,
226     PATH_MTU_PLATEAU_TABLE_OPTION = 25,
227 
228     /*
229      * 5. IP Layer Parameters per Interface
230      * This section details the options that affect the operation of the IP layer on a per-interface basis.  It is
231      * expected that a client can issue multiple requests, one per interface, in order to configure interfaces with
232      * their specific parameters.
233      */
234     INTERFACE_MTU_OPTION = 26,
235     ALL_SUBNETS_ARE_LOCAL_OPTION = 27,
236     BROADCAST_ADDRESS_OPTION = 28,
237     PERFORM_MASK_DISCOVERY_OPTION = 29,
238     MASK_SUPPLIER_OPTION = 30,
239     PERFORM_ROUTER_DISCOVERY_OPTION = 31,
240     ROUTER_SOLICITATION_ADDRESS_OPTION = 32,
241     STATIC_ROUTE_OPTION = 33,
242 
243     /*
244      * 6. Link Layer Parameters per Interface
245      * This section lists the options that affect the operation of the data link layer on a per-interface basis.
246      */
247     TRAILER_ENCAPSULATION_OPTION = 34,   // 6.1. Trailer Encapsulation Option
248     ARP_CACHE_TIMEOUT_OPTION = 35,       // 6.2. ARP Cache Timeout Option
249     ETHERNET_ENCAPSULATION_OPTION = 36,  // 6.3. Ethernet Encapsulation Option
250 
251     /*
252      * 7. TCP Parameters
253      * This section lists the options that affect the operation of the TCP layer on a per-interface basis.
254      */
255     TCP_DEFAULT_TTL_OPTION = 37,         // 7.1. TCP Default TTL Option
256     TCP_KEEPALIVE_INTERVAL_OPTION = 38,  // 7.2. TCP Keepalive Interval Option
257     TCP_KEEPALIVE_GARBAGE_OPTION = 39,   // 7.3. TCP Keepalive Garbage Option
258 
259     /*
260      * 8. Application and Service Parameters
261      * This section details some miscellaneous options used to configure miscellaneous applications and services.
262      */
263     NETWORK_INFO_SERVICE_DOMAIN_OPTION = 40,           // 8.1. Network Information Service Domain Option
264     NETWORK_INFO_SERVERS_OPTION = 41,                  // 8.2. Network Information Servers Option
265     NETWORK_TIME_PROTOCOL_SERVERS_OPTION = 42,         // 8.3. Network Time Protocol Servers Option
266     VENDOR_SPECIFIC_INFO_OPTION = 43,                  // 8.4. Vendor Specific Information
267     NETBIOS_OVER_IP_NAME_SERVER_OPTION = 44,           // 8.5. NetBIOS over TCP/IP Name Server Option
268     NETBIOS_OVER_IP_DATAGRAM_DIST_SERVER_OPTION = 45,  // 8.6. NetBIOS over TCP/IP Datagram Distribution Server Option
269     NETBIOS_OVER_IP_NODE_TYPE_OPTION = 46,             // 8.7. NetBIOS over TCP/IP Node Type Option
270     NETBIOS_OVER_IP_SCOPE_OPTION = 47,                 // 8.8. NetBIOS over TCP/IP Scope Option
271     X_WINDOW_SYSTEM_FONT_SERVER_OPTION = 48,           // 8.9. X Window System Font Server Option
272     X_WINDOW_SYSTEM_DISPLAY_MANAGER_OPTION = 49,       // 8.10. X Window System Display Manager Option
273     NETWORK_INFO_SERVICE_PLUS_DOMAIN_OPTION = 64,      // 8.11. Network Information Service+ Domain Option
274     NETWORK_INFO_SERVICE_PLUS_SERVERS_OPTION = 65,     // 8.12. Network Information Service+ Servers Option
275     MOBILE_IP_HOME_AGENT_OPTION = 68,                  // 8.13. Mobile IP Home Agent option
276     SMTP_SERVER_OPTION = 69,                           // 8.14. Simple Mail Transport Protocol (SMTP) Server Option
277     POP3_SERVER_OPTION = 70,                           // 8.15. Post Office Protocol (POP3) Server Option
278     NNTP_SERVER_OPTION = 71,                           // 8.16. Network News Transport Protocol (NNTP) Server Option
279     DEFAULT_WEB_SERVER_OPTION = 72,                    // 8.17. Default World Wide Web (WWW) Server Option
280     DEFAULT_FINGER_SERVER_OPTION = 73,                 // 8.18. Default Finger Server Option
281     DEFAULT_IRC_SERVER_OPTION = 74,                    // 8.19. Default Internet Relay Chat (IRC) Server Option
282     STREETTALK_SERVER_OPTION = 75,                     // 8.20. StreetTalk Server Option
283     STDA_SERVER_OPTION = 76,                           // 8.21. StreetTalk Directory Assistance (STDA) Server Option
284 
285     /*
286      * 9. DHCP Extensions
287      * This section details the options that are specific to DHCP.
288      */
289     REQUESTED_IP_ADDRESS_OPTION = 50,
290     IP_ADDRESS_LEASE_TIME_OPTION = 51,
291     OPTION_OVERLOAD_OPTION = 52,
292     TFTP_SERVER_NAME_OPTION = 66,
293     BOOTFILE_NAME_OPTION = 67,
294     DHCP_MESSAGE_TYPE_OPTION = 53,
295     SERVER_IDENTIFIER_OPTION = 54,
296     PARAMETER_REQUEST_LIST_OPTION = 55,
297     MESSAGE_OPTION = 56,
298     MAXIMUM_DHCP_MESSAGE_SIZE_OPTION = 57,
299     RENEWAL_TIME_VALUE_OPTION = 58,
300     REBINDING_TIME_VALUE_OPTION = 59,
301     VENDOR_CLASS_IDENTIFIER_OPTION = 60,
302     CLIENT_IDENTIFIER_OPTION = 61,
303     IPV6_ONLY_PREFERRED_OPTION = 108,
304     CAPTIVE_PORTAL_OPTION = 114,
305     /* RFC 6704 */
306     FORCERENEW_NONCE_OPTION = 145, /* Forcerenew Nonce Authentication */
307 };
308 
309 enum DHCP_OPTION_DATA_TYPE {
310     DHCP_OPTION_DATA_INVALID = 0,
311     DHCP_OPTION_DATA_U8,
312     DHCP_OPTION_DATA_U16,
313     DHCP_OPTION_DATA_S16,
314     DHCP_OPTION_DATA_U32,
315     DHCP_OPTION_DATA_S32,
316     DHCP_OPTION_DATA_IP,
317     DHCP_OPTION_DATA_IP_PAIR,
318     DHCP_OPTION_DATA_IP_LIST,
319     DHCP_OPTION_DATA_IP_STRING
320 };
321 
322 
323 /* publish event code */
324 typedef enum EnumPublishEventCode {
325     /* success */
326     PUBLISH_CODE_SUCCESS = 0,
327     /* failed */
328     PUBLISH_CODE_FAILED = -1,
329     /* timeout */
330     PUBLISH_CODE_TIMEOUT = -2,
331     /* lease expired */
332     PUBLISH_CODE_EXPIRED = -3,
333     /* dhcp offer report*/
334     PUBLISH_DHCP_OFFER_REPORT = -4
335 } DhcpEventCode;
336 
337 /* DhcpPacket Fields */
338 struct DhcpPacket {
339     uint8_t op;
340     uint8_t htype;
341     uint8_t hlen;
342     uint8_t hops;
343     uint32_t xid;
344     uint16_t secs;
345     uint16_t flags;
346     uint32_t ciaddr;
347     uint32_t yiaddr;
348     uint32_t siaddr;
349     uint32_t giaddr;
350     uint8_t chaddr[DHCP_HWADDR_LENGTH];
351     uint8_t sname[DHCP_HOST_NAME_LENGTH];
352     uint8_t file[DHCP_BOOT_FILE_LENGTH];
353     int32_t cookie;
354     uint8_t options[DHCP_OPT_SIZE];
355 };
356 
357 struct UdpDhcpPacket {
358     struct iphdr ip;
359     struct udphdr udp;
360     struct DhcpPacket data;
361 };
362 
363 struct DhcpIpResult{
364     int32_t code;                          /* get result code */
365     std::string ifname;                     /* ifname */
366     uint32_t uAddTime;                      /* addTime */
367     uint32_t uOptLeasetime;                 /* dhcp option IP_ADDRESS_LEASE_TIME_OPTION */
368     char strYiaddr[INET_ADDRSTRLEN];        /* your (client) IP */
369     char strOptServerId[INET_ADDRSTRLEN];   /* dhcp option SERVER_IDENTIFIER_OPTION */
370     char strOptSubnet[INET_ADDRSTRLEN];     /* dhcp option SUBNET_MASK_OPTION */
371     char strOptDns1[INET_ADDRSTRLEN];       /* dhcp option DOMAIN_NAME_SERVER_OPTION */
372     char strOptDns2[INET_ADDRSTRLEN];       /* dhcp option DOMAIN_NAME_SERVER_OPTION */
373     char strOptRouter1[INET_ADDRSTRLEN];    /* dhcp option ROUTER_OPTION */
374     char strOptRouter2[INET_ADDRSTRLEN];    /* dhcp option ROUTER_OPTION */
375     char strOptVendor[DHCP_FILE_MAX_BYTES]; /* dhcp option VENDOR_SPECIFIC_INFO_OPTION */
376     std::vector<std::string> dnsAddr;       /* dhcp option MULTI DOMAIN_NAME_SERVER_OPTION */
377 };
378 
379 enum DHCP_IP_TYPE {
380     DHCP_IP_TYPE_NONE =  0,
381     DHCP_IP_TYPE_ALL  =  1,
382     DHCP_IP_TYPE_V4   =  2,
383     DHCP_IP_TYPE_V6   =  3
384 };
385 
386 typedef struct{
387     int  ifaceIndex;                        /* Index of the network interface used by the current process. */
388     bool isIpv6;                            /* IPv6 address of the network interface used to get. */
389     unsigned int ifaceIpv4;                 /* IPv4 of the network interface used by the current process. */
390     unsigned int getMode;                   /* Current process obtaining IPv4 address mode. */
391     unsigned char ifaceMac[MAC_ADDR_LEN];   /* Mac addr of the network interface used by the current process. */
392     char ifaceName[INFNAME_SIZE];           /* Name of the network interface used by the current process. */
393     char workDir[DIR_MAX_LEN];              /* Current process working directory. */
394     char confFile[DIR_MAX_LEN];             /* Current process Configuration Directory. */
395     char leaseFile[DIR_MAX_LEN];
396     char resultFile[DIR_MAX_LEN];           /* Save the obtained IPv4 result. */
397     char result6File[DIR_MAX_LEN];
398 }DhcpClientCfg;
399 
400 struct IpInfoCached {
401     std::string bssid;
402     uint32_t absoluteLeasetime;
403     struct DhcpIpResult ipResult;
404 };
405 
406 /* timer type */
407 enum TimerType {
408     TIMER_GET_IP = 0,
409     TIMER_RENEW_DELAY,
410     TIMER_REBIND_DELAY,
411     TIMER_REMAINING_DELAY,
412 };
413 
414 struct RouterCfg {
415     std::string bssid;
416     bool prohibitUseCacheIp;
417 };
418 #endif