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