Home | History | Annotate | Download | only in inc
      1 /*
      2 Copyright (c) 2013-2016, 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,                     /* NULL */
    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_LAN_DELETE_SELF,                      /* ipacm_event_data_fid */
    190 	IPACM_EVENT_MAX
    191 } ipa_cm_event_id;
    192 
    193 typedef struct
    194 {
    195 	uint8_t num_rule;
    196 	uint32_t rule_hdl[MAX_NUM_PROP];
    197 } lan_to_lan_rt_rule_hdl;
    198 
    199 typedef enum
    200 {
    201 	LAN_IF = 0,
    202 	WLAN_IF,
    203 	WAN_IF,
    204 	VIRTUAL_IF,
    205 	ETH_IF,
    206 	EMBMS_IF,
    207 	ODU_IF,
    208 	UNKNOWN_IF
    209 } ipacm_iface_type;
    210 
    211 typedef enum
    212 {
    213 	ROUTER = 0,
    214 	BRIDGE
    215 } ipacm_cradle_iface_mode;
    216 
    217 typedef enum
    218 {
    219 	FULL,
    220 	INTERNET
    221 } ipacm_wlan_access_mode;
    222 
    223 typedef struct
    224 {
    225 	struct nf_conntrack *ct;
    226 	enum nf_conntrack_msg_type type;
    227 }ipacm_ct_evt_data;
    228 
    229 typedef struct
    230 {
    231 	char iface_name[IPA_IFACE_NAME_LEN];
    232 	ipacm_iface_type if_cat;
    233 	ipacm_cradle_iface_mode if_mode;
    234 	ipacm_wlan_access_mode wlan_mode;
    235 	int netlink_interface_index;
    236 } ipa_ifi_dev_name_t;
    237 
    238 typedef struct
    239 {
    240 	uint32_t subnet_addr;
    241 	uint32_t subnet_mask;
    242 } ipa_private_subnet;
    243 
    244 
    245 typedef struct _ipacm_event_data_all
    246 {
    247 	enum ipa_ip_type iptype;
    248 	int if_index;
    249 	uint32_t  ipv4_addr;
    250 	uint32_t  ipv6_addr[4];
    251 	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
    252 } ipacm_event_data_all;
    253 
    254 class IPACM_Lan;
    255 
    256 typedef struct
    257 {
    258 	ipacm_cradle_iface_mode cradle_wan_mode;
    259 } ipacm_event_cradle_wan_mode;
    260 
    261 typedef struct
    262 {
    263 	IPACM_Lan *p_iface;
    264 	ipa_ip_type iptype;
    265 	uint8_t mac_addr[6];
    266 } ipacm_event_eth_bridge;
    267 
    268 typedef struct
    269 {
    270 	enum ipa_ip_type iptype;
    271 	uint32_t src_ipv4_addr;
    272 	uint32_t dst_ipv4_addr;
    273 	uint32_t src_ipv6_addr[4];
    274 	uint32_t dst_ipv6_addr[4];
    275 } ipacm_event_connection;
    276 
    277 typedef struct _ipacm_event_data_fid
    278 {
    279 	int if_index;
    280 } ipacm_event_data_fid;
    281 
    282 typedef struct
    283 {
    284 	ipacm_iface_type if_cat;
    285 } ipacm_event_data_if_cat;
    286 
    287 typedef struct _ipacm_event_data_iptype
    288 {
    289 	int if_index;
    290 	int if_index_tether;
    291 	enum ipa_ip_type iptype;
    292 #ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN
    293 	uint32_t  ipv4_addr_gw;
    294 	uint32_t  ipv6_addr_gw[4];
    295 #endif
    296 } ipacm_event_data_iptype;
    297 
    298 
    299 typedef struct _ipacm_event_data_addr
    300 {
    301 	enum ipa_ip_type iptype;
    302 	int if_index;
    303 	uint32_t  ipv4_addr_gw;
    304 	uint32_t  ipv4_addr;
    305 	uint32_t  ipv4_addr_mask;
    306 	uint32_t  ipv6_addr[4];
    307 	uint32_t  ipv6_addr_mask[4];
    308 	uint32_t  ipv6_addr_gw[4];
    309 } ipacm_event_data_addr;
    310 
    311 typedef struct _ipacm_event_data_mac
    312 {
    313 	int if_index;
    314 	int ipa_if_cate;
    315 	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
    316 } ipacm_event_data_mac;
    317 
    318 typedef struct
    319 {
    320 	int if_index;
    321 	uint8_t num_of_attribs;
    322 	struct ipa_wlan_hdr_attrib_val attribs[0];
    323 } ipacm_event_data_wlan_ex;
    324 
    325 typedef struct _ipacm_event_iface_up
    326 {
    327 	char ifname[IPA_IFACE_NAME_LEN];
    328 	uint32_t ipv4_addr;
    329 	uint32_t addr_mask;
    330 	uint32_t ipv6_prefix[2];
    331 	bool is_sta;
    332 	uint8_t xlat_mux_id;
    333 }ipacm_event_iface_up;
    334 
    335 typedef struct _ipacm_event_iface_up_tether
    336 {
    337 	uint32_t if_index_tether;
    338 	uint32_t ipv6_prefix[2];
    339 	bool is_sta;
    340 }ipacm_event_iface_up_tehter;
    341 
    342 typedef enum
    343 {
    344 	Q6_WAN = 0,
    345 	WLAN_WAN,
    346 	ECM_WAN
    347 } ipacm_wan_iface_type;
    348 
    349 typedef struct _ipacm_ifacemgr_data
    350 {
    351 	int if_index;
    352 	ipacm_wan_iface_type if_type;
    353 	uint8_t mac_addr[IPA_MAC_ADDR_SIZE];
    354 }ipacm_ifacemgr_data;
    355 
    356 typedef struct _ipacm_offload_prefix {
    357 	enum ipa_ip_type iptype;
    358 	uint32_t v4Addr;
    359 	uint32_t v4Mask;
    360 	uint32_t v6Addr[4];
    361 	uint32_t v6Mask[4];
    362 } ipacm_offload_prefix;
    363 
    364 typedef struct {
    365 	int if_index;
    366 	_ipacm_offload_prefix prefix;
    367 } ipacm_event_ipahal_stream;
    368 
    369 #endif /* IPA_CM_DEFS_H */
    370