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_DEFINE_H 16 #define OHOS_DHCP_DEFINE_H 17 18 #include <stdbool.h> 19 #include <stdint.h> 20 #include <netinet/udp.h> 21 #include <netinet/ip.h> 22 23 #include "wifi_log.h" 24 25 #ifdef __cplusplus 26 extern "C" { 27 #endif 28 29 #define NUMBER_ONE 1 30 #define NUMBER_TWO 2 31 #define NUMBER_THREE 3 32 #define NUMBER_FOUR 4 33 #define NUMBER_FIVE 5 34 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 6 39 #define TIMEOUT_WAIT_SEC 1 40 #define TIMEOUT_MORE_WAIT_SEC 60 41 #define ONE_HOURS_SEC 3600 42 #define LEASETIME_DEFAULT 1 43 #define SLEEP_TIME_200_MS (200 * 1000) 44 #define SLEEP_TIME_500_MS (500 * 1000) 45 46 #define MAC_ADDR_LEN 6 47 #define MAC_ADDR_CHAR_NUM 3 48 #define ETHERNET_TYPE 0x01 49 #define ETHERNET_LEN 6 50 #define VENDOR_MAX_LEN 64 51 #define MAGIC_COOKIE 0x63825363 52 #define BROADCAST_FLAG 0x8000 53 #define MAC_BCAST_ADDR "\xff\xff\xff\xff\xff\xff" 54 #define SIGNED_INTEGER_MAX 0x7FFFFFFF 55 #define PID_MAX_LEN 16 56 #define DEFAULT_UMASK 027 57 #define DIR_MAX_LEN 256 58 #define INFNAME_SIZE 16 /* Length of interface name */ 59 #define RWMODE 0600 60 #define MAX_MSG_SIZE 1500 61 #define DHCP_FILE_MAX_BYTES 128 62 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 /* dhcp state code */ 86 enum EnumDhcpStateCode { 87 DHCP_STATE_INIT = 0, 88 DHCP_STATE_SELECTING, 89 DHCP_STATE_REQUESTING, 90 DHCP_STATE_BOUND, 91 DHCP_STATE_RENEWING, 92 DHCP_STATE_REBINDING, 93 DHCP_STATE_INITREBOOT, 94 DHCP_STATE_RELEASED, 95 DHCP_STATE_RENEWED 96 }; 97 98 /* dhcp return code */ 99 enum EnumErrCode { 100 /* success */ 101 DHCP_OPT_SUCCESS = 0, 102 /* failed */ 103 DHCP_OPT_FAILED, 104 /* null pointer */ 105 DHCP_OPT_NULL, 106 /* timeout */ 107 DHCP_OPT_TIMEOUT, 108 /* error */ 109 DHCP_OPT_ERROR, 110 /* none */ 111 DHCP_OPT_NONE, 112 }; 113 114 /* socket return code */ 115 enum EnumSocketErrCode { 116 /* success */ 117 SOCKET_OPT_SUCCESS = 0, 118 /* failed */ 119 SOCKET_OPT_FAILED = -1, 120 /* error */ 121 SOCKET_OPT_ERROR = -2 122 }; 123 124 /* socket mode */ 125 enum EnumSocketMode { 126 SOCKET_MODE_INVALID = 0, 127 SOCKET_MODE_RAW = 1, 128 SOCKET_MODE_KERNEL = 2 129 }; 130 131 // See: RFC 2132 DHCP Options and BOOTP Vendor Extensions March 1997 132 enum DhcpOptions { 133 /* 134 * 3. RFC 1497 Vendor Extensions 135 * This section lists the vendor extensions as defined in RFC 1497. 136 * They are defined here for completeness. 137 */ 138 PAD_OPTION = 0, 139 END_OPTION = 255, 140 141 SUBNET_MASK_OPTION = 1, 142 TIME_OFFSET_OPTION = 2, 143 ROUTER_OPTION = 3, 144 TIME_SERVER_OPTION = 4, 145 NAME_SERVER_OPTION = 5, 146 DOMAIN_NAME_SERVER_OPTION = 6, 147 LOG_SERVER_OPTION = 7, 148 COOKIE_SERVER_OPTION = 8, 149 LPR_SERVER_OPTION = 9, 150 IMPRESS_SERVER_OPTION = 10, 151 RESOURCE_LOCATION_SERVER_OPTION = 11, 152 HOST_NAME_OPTION = 12, 153 BOOT_FILE_SIZE_OPTION = 13, 154 MERIT_DUMP_FILE_OPTION = 14, 155 DOMAIN_NAME_OPTION = 15, 156 SWAP_SERVER_OPTION = 16, 157 ROOT_PATH_OPTION = 17, 158 EXTENSIONS_PATH_OPTION = 18, 159 160 /* 161 * IP Layer Parameters per Host 162 * This section details the options that affect the operation of the IP layer on a per-host basis. 163 */ 164 IP_FORWARDING_OPTION = 19, 165 NON_LOCAL_SOURCE_ROUTING_OPTION = 20, 166 POLICY_FILTER_OPTION = 21, 167 MAXIMUM_DATAGRAM_REASSEMBLY_SIZE_OPTION = 22, 168 DEFAULT_IP_TIME_TO_LIVE_OPTION = 23, 169 PATH_MTU_AGING_TIMEOUT_OPTION = 24, 170 PATH_MTU_PLATEAU_TABLE_OPTION = 25, 171 172 /* 173 * 5. IP Layer Parameters per Interface 174 * This section details the options that affect the operation of the IP layer on a per-interface basis. It is 175 * expected that a client can issue multiple requests, one per interface, in order to configure interfaces with 176 * their specific parameters. 177 */ 178 INTERFACE_MTU_OPTION = 26, 179 ALL_SUBNETS_ARE_LOCAL_OPTION = 27, 180 BROADCAST_ADDRESS_OPTION = 28, 181 PERFORM_MASK_DISCOVERY_OPTION = 29, 182 MASK_SUPPLIER_OPTION = 30, 183 PERFORM_ROUTER_DISCOVERY_OPTION = 31, 184 ROUTER_SOLICITATION_ADDRESS_OPTION = 32, 185 STATIC_ROUTE_OPTION = 33, 186 187 /* 188 * 6. Link Layer Parameters per Interface 189 * This section lists the options that affect the operation of the data link layer on a per-interface basis. 190 */ 191 TRAILER_ENCAPSULATION_OPTION = 34, // 6.1. Trailer Encapsulation Option 192 ARP_CACHE_TIMEOUT_OPTION = 35, // 6.2. ARP Cache Timeout Option 193 ETHERNET_ENCAPSULATION_OPTION = 36, // 6.3. Ethernet Encapsulation Option 194 195 /* 196 * 7. TCP Parameters 197 * This section lists the options that affect the operation of the TCP layer on a per-interface basis. 198 */ 199 TCP_DEFAULT_TTL_OPTION = 37, // 7.1. TCP Default TTL Option 200 TCP_KEEPALIVE_INTERVAL_OPTION = 38, // 7.2. TCP Keepalive Interval Option 201 TCP_KEEPALIVE_GARBAGE_OPTION = 39, // 7.3. TCP Keepalive Garbage Option 202 203 /* 204 * 8. Application and Service Parameters 205 * This section details some miscellaneous options used to configure miscellaneous applications and services. 206 */ 207 NETWORK_INFO_SERVICE_DOMAIN_OPTION = 40, // 8.1. Network Information Service Domain Option 208 NETWORK_INFO_SERVERS_OPTION = 41, // 8.2. Network Information Servers Option 209 NETWORK_TIME_PROTOCOL_SERVERS_OPTION = 42, // 8.3. Network Time Protocol Servers Option 210 VENDOR_SPECIFIC_INFO_OPTION = 43, // 8.4. Vendor Specific Information 211 NETBIOS_OVER_IP_NAME_SERVER_OPTION = 44, // 8.5. NetBIOS over TCP/IP Name Server Option 212 NETBIOS_OVER_IP_DATAGRAM_DIST_SERVER_OPTION = 45, // 8.6. NetBIOS over TCP/IP Datagram Distribution Server Option 213 NETBIOS_OVER_IP_NODE_TYPE_OPTION = 46, // 8.7. NetBIOS over TCP/IP Node Type Option 214 NETBIOS_OVER_IP_SCOPE_OPTION = 47, // 8.8. NetBIOS over TCP/IP Scope Option 215 X_WINDOW_SYSTEM_FONT_SERVER_OPTION = 48, // 8.9. X Window System Font Server Option 216 X_WINDOW_SYSTEM_DISPLAY_MANAGER_OPTION = 49, // 8.10. X Window System Display Manager Option 217 NETWORK_INFO_SERVICE_PLUS_DOMAIN_OPTION = 64, // 8.11. Network Information Service+ Domain Option 218 NETWORK_INFO_SERVICE_PLUS_SERVERS_OPTION = 65, // 8.12. Network Information Service+ Servers Option 219 MOBILE_IP_HOME_AGENT_OPTION = 68, // 8.13. Mobile IP Home Agent option 220 SMTP_SERVER_OPTION = 69, // 8.14. Simple Mail Transport Protocol (SMTP) Server Option 221 POP3_SERVER_OPTION = 70, // 8.15. Post Office Protocol (POP3) Server Option 222 NNTP_SERVER_OPTION = 71, // 8.16. Network News Transport Protocol (NNTP) Server Option 223 DEFAULT_WEB_SERVER_OPTION = 72, // 8.17. Default World Wide Web (WWW) Server Option 224 DEFAULT_FINGER_SERVER_OPTION = 73, // 8.18. Default Finger Server Option 225 DEFAULT_IRC_SERVER_OPTION = 74, // 8.19. Default Internet Relay Chat (IRC) Server Option 226 STREETTALK_SERVER_OPTION = 75, // 8.20. StreetTalk Server Option 227 STDA_SERVER_OPTION = 76, // 8.21. StreetTalk Directory Assistance (STDA) Server Option 228 229 /* 230 * 9. DHCP Extensions 231 * This section details the options that are specific to DHCP. 232 */ 233 REQUESTED_IP_ADDRESS_OPTION = 50, 234 IP_ADDRESS_LEASE_TIME_OPTION = 51, 235 OPTION_OVERLOAD_OPTION = 52, 236 TFTP_SERVER_NAME_OPTION = 66, 237 BOOTFILE_NAME_OPTION = 67, 238 DHCP_MESSAGE_TYPE_OPTION = 53, 239 SERVER_IDENTIFIER_OPTION = 54, 240 PARAMETER_REQUEST_LIST_OPTION = 55, 241 MESSAGE_OPTION = 56, 242 MAXIMUM_DHCP_MESSAGE_SIZE_OPTION = 57, 243 RENEWAL_TIME_VALUE_OPTION = 58, 244 REBINDING_TIME_VALUE_OPTION = 59, 245 VENDOR_CLASS_IDENTIFIER_OPTION = 60, 246 CLIENT_IDENTIFIER_OPTION = 61, 247 248 /* RFC 6704 */ 249 FORCERENEW_NONCE_OPTION = 145, /* Forcerenew Nonce Authentication */ 250 }; 251 252 enum DHCP_OPTION_DATA_TYPE { 253 DHCP_OPTION_DATA_INVALID = 0, 254 DHCP_OPTION_DATA_U8, 255 DHCP_OPTION_DATA_U16, 256 DHCP_OPTION_DATA_S16, 257 DHCP_OPTION_DATA_U32, 258 DHCP_OPTION_DATA_S32, 259 DHCP_OPTION_DATA_IP, 260 DHCP_OPTION_DATA_IP_PAIR, 261 DHCP_OPTION_DATA_IP_LIST, 262 DHCP_OPTION_DATA_IP_STRING 263 }; 264 265 /* publish event code */ 266 enum EnumPublishEventCode { 267 /* success */ 268 PUBLISH_CODE_SUCCESS = 0, 269 /* failed */ 270 PUBLISH_CODE_FAILED = -1 271 }; 272 273 /* Sizes for DhcpPacket Fields */ 274 #define DHCP_HWADDR_LENGTH 16 275 #define DHCP_HOST_NAME_LENGTH 64 276 #define DHCP_BOOT_FILE_LENGTH 128 277 #define DHCP_OPTIONS_SIZE 308 278 #define DHCP_OPT_CODE_INDEX 0 279 #define DHCP_OPT_LEN_INDEX 1 280 #define DHCP_OPT_DATA_INDEX 2 281 #define DHCP_OPT_CODE_BYTES 1 282 #define DHCP_OPT_LEN_BYTES 1 283 #define DHCP_UINT8_BYTES 1 284 #define DHCP_UINT16_BYTES 2 285 #define DHCP_UINT32_BYTES 4 286 #define DHCP_UINT32_DOUBLE_BYTES 8 287 #define DHCP_UINT16_BITS 16 288 #define DHCP_REQ_CODE_NUM 10 289 290 #define OPTION_FIELD 0 291 #define FILE_FIELD 1 292 #define SNAME_FIELD 2 293 294 /* DhcpPacket Fields */ 295 struct DhcpPacket { 296 uint8_t op; 297 uint8_t htype; 298 uint8_t hlen; 299 uint8_t hops; 300 uint32_t xid; 301 uint16_t secs; 302 uint16_t flags; 303 uint32_t ciaddr; 304 uint32_t yiaddr; 305 uint32_t siaddr; 306 uint32_t giaddr; 307 uint8_t chaddr[DHCP_HWADDR_LENGTH]; 308 uint8_t sname[DHCP_HOST_NAME_LENGTH]; 309 uint8_t file[DHCP_BOOT_FILE_LENGTH]; 310 int32_t cookie; 311 uint8_t options[DHCP_OPTIONS_SIZE]; 312 }; 313 314 struct UdpDhcpPacket { 315 struct iphdr ip; 316 struct udphdr udp; 317 struct DhcpPacket data; 318 }; 319 320 struct DhcpResult { 321 char strYiaddr[INET_ADDRSTRLEN]; /* your (client) IP */ 322 char strOptServerId[INET_ADDRSTRLEN]; /* dhcp option SERVER_IDENTIFIER_OPTION */ 323 char strOptSubnet[INET_ADDRSTRLEN]; /* dhcp option SUBNET_MASK_OPTION */ 324 char strOptDns1[INET_ADDRSTRLEN]; /* dhcp option DOMAIN_NAME_SERVER_OPTION */ 325 char strOptDns2[INET_ADDRSTRLEN]; /* dhcp option DOMAIN_NAME_SERVER_OPTION */ 326 char strOptRouter1[INET_ADDRSTRLEN]; /* dhcp option ROUTER_OPTION */ 327 char strOptRouter2[INET_ADDRSTRLEN]; /* dhcp option ROUTER_OPTION */ 328 char strOptVendor[DHCP_FILE_MAX_BYTES]; /* dhcp option VENDOR_SPECIFIC_INFO_OPTION */ 329 uint32_t uOptLeasetime; /* dhcp option IP_ADDRESS_LEASE_TIME_OPTION */ 330 }; 331 332 #ifdef __cplusplus 333 } 334 #endif 335 #endif 336