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