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