1 /* 2 Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are 6 met: 7 * Redistributions of source code must retain the above copyright 8 notice, this list of conditions and the following disclaimer. 9 * Redistributions in binary form must reproduce the above 10 copyright notice, this list of conditions and the following 11 disclaimer in the documentation and/or other materials provided 12 with the distribution. 13 * Neither the name of The Linux Foundation nor the names of its 14 contributors may be used to endorse or promote products derived 15 from this software without specific prior written permission. 16 17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 /*! 30 @file 31 IPACM_Defs.h 32 33 @brief 34 This file implements the common definitions amon all ifaces. 35 36 @Author 37 Skylar Chang 38 39 */ 40 #ifndef IPA_CM_DEFS_H 41 #define IPA_CM_DEFS_H 42 43 #include <unistd.h> 44 #include <fcntl.h> 45 #include <linux/msm_ipa.h> 46 #include "IPACM_Log.h" 47 48 #ifdef USE_GLIB 49 #include <glib.h> 50 #define strlcpy g_strlcpy 51 #define strlcat g_strlcat 52 #endif 53 54 extern "C" 55 { 56 #include <libnetfilter_conntrack/libnetfilter_conntrack.h> 57 #include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h> 58 } 59 60 #define IF_NAME_LEN 16 61 #define IPA_MAX_FILE_LEN 64 62 #define IPA_IFACE_NAME_LEN 16 63 #define IPA_ALG_PROTOCOL_NAME_LEN 10 64 65 #define IPA_WLAN_PARTIAL_HDR_OFFSET 0 // dst mac first then src mac 66 #define IPA_ODU_PARTIAL_HDR_OFFSET 8 // dst mac first then src mac 67 #define IPA_WLAN_PARTIAL_HDR_NAME_v4 "IEEE802_3_v4" 68 #define IPA_WLAN_PARTIAL_HDR_NAME_v6 "IEEE802_3_v6" 69 #define IPA_DUMMY_ETH_HDR_NAME_v6 "ETH_dummy_v6" 70 #define IPA_WAN_PARTIAL_HDR_NAME_v4 "IEEE802_3_STA_v4" 71 #define IPA_WAN_PARTIAL_HDR_NAME_v6 "IEEE802_3_STA_v6" 72 #define IPA_ETH_HDR_NAME_v4 "IPACM_ETH_v4" 73 #define IPA_ETH_HDR_NAME_v6 "IPACM_ETH_v6" 74 #define IPA_ODU_HDR_NAME_v4 "IPACM_ODU_v4" 75 #define IPA_ODU_HDR_NAME_v6 "IPACM_ODU_v6" 76 77 78 #define IPA_MAX_IFACE_ENTRIES 20 79 #define IPA_MAX_PRIVATE_SUBNET_ENTRIES 3 80 #define IPA_MAX_ALG_ENTRIES 20 81 #define IPA_MAX_RM_ENTRY 6 82 83 #define IPV4_ADDR_LINKLOCAL 0xA9FE0000 84 #define IPV4_ADDR_LINKLOCAL_MASK 0xFFFF0000 85 86 #define V4_DEFAULT_ROUTE_TABLE_NAME "ipa_dflt_rt" 87 #define V4_LAN_ROUTE_TABLE_NAME "COMRTBLLANv4" 88 #define V4_WAN_ROUTE_TABLE_NAME "WANRTBLv4" 89 #define WAN_DL_ROUTE_TABLE_NAME "ipa_dflt_wan_rt" 90 #define V6_COMMON_ROUTE_TABLE_NAME "COMRTBLv6" 91 #define V6_WAN_ROUTE_TABLE_NAME "WANRTBLv6" 92 #define V4_ODU_ROUTE_TABLE_NAME "ODURTBLv4" 93 #define V6_ODU_ROUTE_TABLE_NAME "ODURTBLv6" 94 95 #define WWAN_QMI_IOCTL_DEVICE_NAME "/dev/wwan_ioctl" 96 #define IPA_DEVICE_NAME "/dev/ipa" 97 #define MAX_NUM_PROP 2 98 99 #ifndef FEATURE_IPA_V3 100 #define IPA_MAX_FLT_RULE 50 101 #else 102 #define IPA_MAX_FLT_RULE 100 103 #endif 104 105 #define TCP_FIN_SHIFT 16 106 #define TCP_SYN_SHIFT 17 107 #define TCP_RST_SHIFT 18 108 #define NUM_IPV6_PREFIX_FLT_RULE 1 109 110 /*--------------------------------------------------------------------------- 111 Return values indicating error status 112 ---------------------------------------------------------------------------*/ 113 114 #define IPACM_SUCCESS 0 /* Successful operation */ 115 #define IPACM_FAILURE -1 /* Unsuccessful operation */ 116 117 #define IPACM_IP_NULL (ipa_ip_type)0xFF 118 #define IPACM_INVALID_INDEX (ipa_ip_type)0xFF 119 120 #define IPA_MAX_NUM_WIFI_CLIENTS 32 121 #define IPA_MAX_NUM_WAN_CLIENTS 10 122 #define IPA_MAX_NUM_ETH_CLIENTS 15 123 #define IPA_MAX_NUM_AMPDU_RULE 15 124 #define IPA_MAC_ADDR_SIZE 6 125 126 /*=========================================================================== 127 GLOBAL DEFINITIONS AND DECLARATIONS 128 ===========================================================================*/ 129 typedef enum 130 { 131 IPA_CFG_CHANGE_EVENT, /* NULL */ 132 IPA_PRIVATE_SUBNET_CHANGE_EVENT, /* ipacm_event_data_fid */ 133 IPA_FIREWALL_CHANGE_EVENT, /* NULL */ 134 IPA_LINK_UP_EVENT, /* ipacm_event_data_fid */ 135 IPA_LINK_DOWN_EVENT, /* ipacm_event_data_fid */ 136 IPA_USB_LINK_UP_EVENT, /* ipacm_event_data_fid */ 137 IPA_BRIDGE_LINK_UP_EVENT, /* ipacm_event_data_all */ 138 IPA_WAN_EMBMS_LINK_UP_EVENT, /* ipacm_event_data_mac */ 139 IPA_ADDR_ADD_EVENT, /* ipacm_event_data_addr */ 140 IPA_ADDR_DEL_EVENT, /* no use */ 141 IPA_ROUTE_ADD_EVENT, /* ipacm_event_data_addr */ 142 IPA_ROUTE_DEL_EVENT, /* ipacm_event_data_addr */ 143 IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, /* ipacm_event_data_fid */ 144 IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT, /* ipacm_event_data_fid */ 145 IPA_WLAN_AP_LINK_UP_EVENT, /* ipacm_event_data_mac */ 146 IPA_WLAN_STA_LINK_UP_EVENT, /* ipacm_event_data_mac */ 147 IPA_WLAN_LINK_DOWN_EVENT, /* ipacm_event_data_mac */ 148 IPA_WLAN_CLIENT_ADD_EVENT, /* ipacm_event_data_mac */ 149 IPA_WLAN_CLIENT_ADD_EVENT_EX, /* ipacm_event_data_wlan_ex */ 150 IPA_WLAN_CLIENT_DEL_EVENT, /* ipacm_event_data_mac */ 151 IPA_WLAN_CLIENT_POWER_SAVE_EVENT, /* ipacm_event_data_mac */ 152 IPA_WLAN_CLIENT_RECOVER_EVENT, /* ipacm_event_data_mac */ 153 IPA_NEW_NEIGH_EVENT, /* ipacm_event_data_all */ 154 IPA_DEL_NEIGH_EVENT, /* ipacm_event_data_all */ 155 IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, /* ipacm_event_data_all */ 156 IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, /* ipacm_event_data_all */ 157 IPA_SW_ROUTING_ENABLE, /* NULL */ 158 IPA_SW_ROUTING_DISABLE, /* NULL */ 159 IPA_PROCESS_CT_MESSAGE, /* ipacm_ct_evt_data */ 160 IPA_PROCESS_CT_MESSAGE_V6, /* ipacm_ct_evt_data */ 161 IPA_LAN_TO_LAN_NEW_CONNECTION, /* ipacm_event_connection */ 162 IPA_LAN_TO_LAN_DEL_CONNECTION, /* ipacm_event_connection */ 163 IPA_WLAN_SWITCH_TO_SCC, /* No Data */ 164 IPA_WLAN_SWITCH_TO_MCC, /* No Data */ 165 IPA_CRADLE_WAN_MODE_SWITCH, /* ipacm_event_cradle_wan_mode */ 166 IPA_WAN_XLAT_CONNECT_EVENT, /* ipacm_event_data_fid */ 167 IPA_TETHERING_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */ 168 IPA_NETWORK_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */ 169 IPA_DOWNSTREAM_ADD, /* ipacm_event_ipahal_stream */ 170 IPA_DOWNSTREAM_DEL, /* ipacm_event_ipahal_stream */ 171 172 IPA_EXTERNAL_EVENT_MAX, 173 174 IPA_HANDLE_WAN_UP, /* ipacm_event_iface_up */ 175 IPA_HANDLE_WAN_DOWN, /* ipacm_event_iface_up */ 176 IPA_HANDLE_WAN_UP_V6, /* ipacm_event_iface_up */ 177 IPA_HANDLE_WAN_DOWN_V6, /* NULL */ 178 IPA_HANDLE_WAN_UP_TETHER, /* ipacm_event_iface_up_tehter */ 179 IPA_HANDLE_WAN_DOWN_TETHER, /* ipacm_event_iface_up_tehter */ 180 IPA_HANDLE_WAN_UP_V6_TETHER, /* ipacm_event_iface_up_tehter */ 181 IPA_HANDLE_WAN_DOWN_V6_TETHER, /* ipacm_event_iface_up_tehter */ 182 IPA_HANDLE_WLAN_UP, /* ipacm_event_iface_up */ 183 IPA_HANDLE_LAN_UP, /* ipacm_event_iface_up */ 184 IPA_ETH_BRIDGE_IFACE_UP, /* ipacm_event_eth_bridge*/ 185 IPA_ETH_BRIDGE_IFACE_DOWN, /* ipacm_event_eth_bridge*/ 186 IPA_ETH_BRIDGE_CLIENT_ADD, /* ipacm_event_eth_bridge */ 187 IPA_ETH_BRIDGE_CLIENT_DEL, /* ipacm_event_eth_bridge*/ 188 IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, /* ipacm_event_eth_bridge*/ 189 IPA_SSR_NOTICE, /* NULL*/ 190 #ifdef FEATURE_L2TP 191 IPA_ADD_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ 192 IPA_DEL_VLAN_IFACE, /* ipa_ioc_vlan_iface_info */ 193 IPA_ADD_L2TP_VLAN_MAPPING, /* ipa_ioc_l2tp_vlan_mapping_info */ 194 IPA_DEL_L2TP_VLAN_MAPPING, /* ipa_ioc_l2tp_vlan_mapping_info */ 195 IPA_HANDLE_VLAN_CLIENT_INFO, /* ipacm_event_data_all */ 196 IPA_HANDLE_VLAN_IFACE_INFO, /* ipacm_event_data_all */ 197 #endif 198 IPA_WLAN_FWR_SSR_BEFORE_SHUTDOWN_NOTICE, 199 IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */ 200 IPACM_EVENT_MAX 201 } ipa_cm_event_id; 202 203 typedef struct 204 { 205 uint8_t num_rule; 206 uint32_t rule_hdl[MAX_NUM_PROP]; 207 } lan_to_lan_rt_rule_hdl; 208 209 typedef enum 210 { 211 LAN_IF = 0, 212 WLAN_IF, 213 WAN_IF, 214 VIRTUAL_IF, 215 ETH_IF, 216 EMBMS_IF, 217 ODU_IF, 218 UNKNOWN_IF 219 } ipacm_iface_type; 220 221 typedef enum 222 { 223 ROUTER = 0, 224 BRIDGE 225 } ipacm_cradle_iface_mode; 226 227 typedef enum 228 { 229 FULL, 230 INTERNET 231 } ipacm_wlan_access_mode; 232 233 typedef struct 234 { 235 struct nf_conntrack *ct; 236 enum nf_conntrack_msg_type type; 237 }ipacm_ct_evt_data; 238 239 typedef struct 240 { 241 char iface_name[IPA_IFACE_NAME_LEN]; 242 ipacm_iface_type if_cat; 243 ipacm_cradle_iface_mode if_mode; 244 ipacm_wlan_access_mode wlan_mode; 245 int netlink_interface_index; 246 } ipa_ifi_dev_name_t; 247 248 typedef struct 249 { 250 uint32_t subnet_addr; 251 uint32_t subnet_mask; 252 } ipa_private_subnet; 253 254 255 typedef struct _ipacm_event_data_all 256 { 257 enum ipa_ip_type iptype; 258 int if_index; 259 uint32_t ipv4_addr; 260 uint32_t ipv6_addr[4]; 261 uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; 262 char iface_name[IPA_IFACE_NAME_LEN]; 263 } ipacm_event_data_all; 264 265 class IPACM_Lan; 266 267 typedef struct 268 { 269 ipacm_cradle_iface_mode cradle_wan_mode; 270 } ipacm_event_cradle_wan_mode; 271 272 typedef struct 273 { 274 IPACM_Lan *p_iface; 275 ipa_ip_type iptype; 276 uint8_t mac_addr[6]; 277 char iface_name[IPA_IFACE_NAME_LEN]; 278 } ipacm_event_eth_bridge; 279 280 typedef struct 281 { 282 enum ipa_ip_type iptype; 283 uint32_t src_ipv4_addr; 284 uint32_t dst_ipv4_addr; 285 uint32_t src_ipv6_addr[4]; 286 uint32_t dst_ipv6_addr[4]; 287 } ipacm_event_connection; 288 289 typedef struct _ipacm_event_data_fid 290 { 291 int if_index; 292 } ipacm_event_data_fid; 293 294 typedef struct 295 { 296 ipacm_iface_type if_cat; 297 } ipacm_event_data_if_cat; 298 299 typedef struct _ipacm_event_data_iptype 300 { 301 int if_index; 302 int if_index_tether; 303 enum ipa_ip_type iptype; 304 #ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN 305 uint32_t ipv4_addr_gw; 306 uint32_t ipv6_addr_gw[4]; 307 #endif 308 } ipacm_event_data_iptype; 309 310 311 typedef struct _ipacm_event_data_addr 312 { 313 enum ipa_ip_type iptype; 314 char iface_name[IPA_IFACE_NAME_LEN]; 315 int if_index; 316 uint32_t ipv4_addr_gw; 317 uint32_t ipv4_addr; 318 uint32_t ipv4_addr_mask; 319 uint32_t ipv6_addr[4]; 320 uint32_t ipv6_addr_mask[4]; 321 uint32_t ipv6_addr_gw[4]; 322 } ipacm_event_data_addr; 323 324 typedef struct _ipacm_event_data_mac 325 { 326 int if_index; 327 int ipa_if_cate; 328 uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; 329 } ipacm_event_data_mac; 330 331 typedef struct 332 { 333 int if_index; 334 uint8_t num_of_attribs; 335 struct ipa_wlan_hdr_attrib_val attribs[0]; 336 } ipacm_event_data_wlan_ex; 337 338 typedef struct _ipacm_event_iface_up 339 { 340 char ifname[IPA_IFACE_NAME_LEN]; 341 uint32_t ipv4_addr; 342 uint32_t addr_mask; 343 uint32_t ipv6_prefix[2]; 344 bool is_sta; 345 uint8_t xlat_mux_id; 346 uint8_t mux_id; 347 }ipacm_event_iface_up; 348 349 typedef struct _ipacm_event_iface_up_tether 350 { 351 uint32_t if_index_tether; 352 uint32_t ipv6_prefix[2]; 353 bool is_sta; 354 }ipacm_event_iface_up_tehter; 355 356 typedef enum 357 { 358 Q6_WAN = 0, 359 WLAN_WAN, 360 ECM_WAN 361 } ipacm_wan_iface_type; 362 363 typedef struct _ipacm_ifacemgr_data 364 { 365 int if_index; 366 ipacm_wan_iface_type if_type; 367 uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; 368 }ipacm_ifacemgr_data; 369 370 typedef struct _ipacm_offload_prefix { 371 enum ipa_ip_type iptype; 372 uint32_t v4Addr; 373 uint32_t v4Mask; 374 uint32_t v6Addr[4]; 375 uint32_t v6Mask[4]; 376 } ipacm_offload_prefix; 377 378 typedef struct { 379 int if_index; 380 _ipacm_offload_prefix prefix; 381 } ipacm_event_ipahal_stream; 382 383 #endif /* IPA_CM_DEFS_H */ 384