diff options
author | Thierry Strudel <tstrudel@google.com> | 2017-03-03 18:32:00 -0800 |
---|---|---|
committer | Thierry Strudel <tstrudel@google.com> | 2017-03-03 18:32:00 -0800 |
commit | 5b5af67d19baf862f5a8d6a7226feb630ec2f81a (patch) | |
tree | 4b825dc642cb6eb9a060e54bf8d69288fbee4904 | |
parent | c98fccba408dbb6070f1630b000db75fb3010bf0 (diff) | |
download | ipacfg-mgr-android-8.0.0_r13.tar.gz |
Emptying repository to get contribution from AOSPandroid-vts-8.0_r9android-vts-8.0_r8android-vts-8.0_r7android-vts-8.0_r6android-vts-8.0_r2android-vts-8.0_r13android-vts-8.0_r12android-vts-8.0_r11android-vts-8.0_r10android-vts-8.0_r1android-security-8.0.0_r54android-security-8.0.0_r53android-security-8.0.0_r52android-o-mr1-preview-2android-o-mr1-preview-1android-cts-8.0_r9android-cts-8.0_r8android-cts-8.0_r7android-cts-8.0_r6android-cts-8.0_r5android-cts-8.0_r4android-cts-8.0_r3android-cts-8.0_r26android-cts-8.0_r25android-cts-8.0_r24android-cts-8.0_r23android-cts-8.0_r22android-cts-8.0_r21android-cts-8.0_r20android-cts-8.0_r2android-cts-8.0_r19android-cts-8.0_r18android-cts-8.0_r17android-cts-8.0_r16android-cts-8.0_r15android-cts-8.0_r14android-cts-8.0_r13android-cts-8.0_r12android-cts-8.0_r11android-cts-8.0_r10android-cts-8.0_r1android-8.0.0_r9android-8.0.0_r7android-8.0.0_r51android-8.0.0_r50android-8.0.0_r49android-8.0.0_r48android-8.0.0_r47android-8.0.0_r46android-8.0.0_r45android-8.0.0_r44android-8.0.0_r43android-8.0.0_r42android-8.0.0_r41android-8.0.0_r40android-8.0.0_r4android-8.0.0_r39android-8.0.0_r38android-8.0.0_r37android-8.0.0_r36android-8.0.0_r35android-8.0.0_r32android-8.0.0_r31android-8.0.0_r30android-8.0.0_r3android-8.0.0_r29android-8.0.0_r28android-8.0.0_r2android-8.0.0_r17android-8.0.0_r16android-8.0.0_r15android-8.0.0_r13android-8.0.0_r12android-8.0.0_r11android-8.0.0_r10android-8.0.0_r1security-oc-releaseoreo-vts-releaseoreo-security-releaseoreo-releaseoreo-r6-releaseoreo-r5-releaseoreo-r4-releaseoreo-r3-releaseoreo-r2-releaseoreo-devoreo-cts-release
Change-Id: Ia0d69a6e1aa0212b94d2e868bd819623cb854a34
Signed-off-by: Thierry Strudel <tstrudel@google.com>
85 files changed, 0 insertions, 35561 deletions
diff --git a/Android.mk b/Android.mk deleted file mode 100644 index cc1ba0e..0000000 --- a/Android.mk +++ /dev/null @@ -1,3 +0,0 @@ -ifneq ($(filter msm8998,$(TARGET_BOARD_PLATFORM)),) - include $(call first-makefiles-under,$(LOCAL_PATH)) -endif diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index fab2aff..0000000 --- a/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 -AUTOMAKE_OPTIONS = foreign -SUBDIRS = ipanat/src ipacm/src/ diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 33164c0..0000000 --- a/configure.ac +++ /dev/null @@ -1,57 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ([2.65]) -AC_INIT(data-ipa, 1.0.0) -AM_INIT_AUTOMAKE(data-ipa, 1.0.0) -AC_OUTPUT(Makefile ipanat/src/Makefile ipacm/src/Makefile) -AC_CONFIG_SRCDIR([ipanat/src/ipa_nat_drv.c]) -AC_CONFIG_HEADERS([config.h]) -AC_CONFIG_MACRO_DIR([m4]) - -# Checks for programs. -AC_PROG_CC -AC_PROG_LIBTOOL -AC_PROG_CXX - -PKG_CHECK_MODULES([LIBXML], [libxml-2.0]) -AC_SUBST([LIBXML_CFLAGS]) -AC_SUBST([LIBXML_LIBS]) - -# Checks for libraries. - -AC_ARG_WITH(sanitized-headers, - AS_HELP_STRING([--with-sanitized-headers=DIR], - [Specify the location of the sanitized Linux headers]), - [CPPFLAGS="$CPPFLAGS -idirafter $withval"]) - -AC_ARG_WITH([glib], - AC_HELP_STRING([--with-glib], - [enable glib, building HLOS systems which use glib])) - -if (test "x${with_glib}" = "xyes"); then - AC_DEFINE(ENABLE_USEGLIB, 1, [Define if HLOS systems uses glib]) - PKG_CHECK_MODULES(GTHREAD, gthread-2.0 >= 2.16, dummy=yes, - AC_MSG_ERROR(GThread >= 2.16 is required)) - PKG_CHECK_MODULES(GLIB, glib-2.0 >= 2.16, dummy=yes, - AC_MSG_ERROR(GLib >= 2.16 is required)) - GLIB_CFLAGS="$GLIB_CFLAGS $GTHREAD_CFLAGS" - GLIB_LIBS="$GLIB_LIBS $GTHREAD_LIBS" - AC_SUBST(GLIB_CFLAGS) - AC_SUBST(GLIB_LIBS) -fi - -AM_CONDITIONAL(USE_GLIB, test "x${with_glib}" = "xyes") - -# Checks for header files. -AC_CHECK_HEADERS([fcntl.h netinet/in.h sys/ioctl.h unistd.h]) - -# Checks for typedefs, structures, and compiler characteristics. -AC_TYPE_OFF_T - -# Checks for library functions. -AC_FUNC_MALLOC -AC_FUNC_MMAP -AC_CHECK_FUNCS([memset munmap]) - -AC_OUTPUT diff --git a/ipacm/inc/IPACM_CmdQueue.h b/ipacm/inc/IPACM_CmdQueue.h deleted file mode 100644 index 27d7c8b..0000000 --- a/ipacm/inc/IPACM_CmdQueue.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_CmdQueue.h - - @brief - This file implements the IPAM Comment Queue definitions - - @Author - -*/ -#ifndef IPA_CONNTRACK_MESSAGE_H -#define IPA_CONNTRACK_MESSAGE_H - -#include <pthread.h> -#include "IPACM_Defs.h" - - - -/*--------------------------------------------------------------------------- - Event data required by IPA_CM ----------------------------------------------------------------------------*/ - - -typedef struct _ipacm_cmd_q_data { - ipa_cm_event_id event; - void *evt_data; -}ipacm_cmd_q_data; - -typedef struct cmd_s -{ - void (*callback_ptr)(ipacm_cmd_q_data *); - ipacm_cmd_q_data data; -}cmd_t; - -class Message -{ -private: - Message *m_next; - -public: - cmd_t evt; - - Message() - { - m_next = NULL; - evt.callback_ptr = NULL; - } - ~Message() { } - void setnext(Message *item) { m_next = item; } - Message* getnext() { return m_next; } -}; - -class MessageQueue -{ - -private: - Message *Head; - Message *Tail; - Message* dequeue(void); - static MessageQueue *inst_internal; - static MessageQueue *inst_external; - - MessageQueue() - { - Head = NULL; - Tail = NULL; - } - -public: - - ~MessageQueue() { } - void enqueue(Message *item); - - static void* Process(void *); - static MessageQueue* getInstanceInternal(); - static MessageQueue* getInstanceExternal(); - -}; - -#endif /* IPA_CONNTRACK_MESSAGE_H */ - diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h deleted file mode 100644 index 5bcb4eb..0000000 --- a/ipacm/inc/IPACM_Config.h +++ /dev/null @@ -1,357 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Config.h - - @brief - This file implements the IPACM Configuration from XML file - - @Author - Skylar Chang - -*/ -#ifndef IPACM_CONFIG_H -#define IPACM_CONFIG_H - -#include "IPACM_Defs.h" -#include "IPACM_Xml.h" -#include "IPACM_EvtDispatcher.h" - -typedef struct -{ - char iface_name[IPA_IFACE_NAME_LEN]; -}NatIfaces; - -/* for IPACM rm dependency use*/ -typedef struct _ipa_rm_client -{ - ipa_rm_resource_name producer_rm1; - ipa_rm_resource_name consumer_rm1; - ipa_rm_resource_name producer_rm2; - ipa_rm_resource_name consumer_rm2; - bool producer1_up; /* only monitor producer_rm1, not monitor producer_rm2 */ - bool consumer1_up; /* only monitor consumer_rm1, not monitor consumer_rm2 */ - bool rm_set; /* once producer1_up and consumer1_up, will add bi-directional dependency */ - bool rx_bypass_ipa; /* support WLAN may not register RX-property, should not add dependency */ -}ipa_rm_client; - -#define MAX_NUM_EXT_PROPS 25 - -/* used to hold extended properties */ -typedef struct -{ - uint8_t num_ext_props; - ipa_ioc_ext_intf_prop prop[MAX_NUM_EXT_PROPS]; -} ipacm_ext_prop; - -/* iface */ -class IPACM_Config -{ -public: - - /* IPACM ipa_client map to rm_resource*/ - ipa_rm_resource_name ipa_client_rm_map_tbl[IPA_CLIENT_MAX]; - - /* IPACM monitored rm_depency table */ - ipa_rm_client ipa_rm_tbl[IPA_MAX_RM_ENTRY]; - - /* IPACM rm_depency a2 endpoint check*/ - int ipa_rm_a2_check; - - /* Store interested interface and their configuration from XML file */ - ipa_ifi_dev_name_t *iface_table; - - /* Store interested ALG port from XML file */ - ipacm_alg *alg_table; - - /* Store private subnet configuration from XML file */ - ipa_private_subnet private_subnet_table[IPA_MAX_PRIVATE_SUBNET_ENTRIES]; - - /* Store the non nat iface names */ - NatIfaces *pNatIfaces; - - /* Store the bridge iface names */ - char ipa_virtual_iface_name[IPA_IFACE_NAME_LEN]; - - /* Store the number of interface IPACM read from XML file */ - int ipa_num_ipa_interfaces; - - int ipa_num_private_subnet; - - int ipa_num_alg_ports; - - int ipa_nat_max_entries; - - bool ipacm_odu_router_mode; - - bool ipacm_odu_enable; - - bool ipacm_odu_embms_enable; - - bool ipacm_ip_passthrough_mode; - - int ipa_nat_iface_entries; - - /* Store the total number of wlan guest ap configured */ - int ipa_num_wlan_guest_ap; - - /* Max valid rm entry */ - int ipa_max_valid_rm_entry; - - /* Store SW-enable or not */ - bool ipa_sw_rt_enable; - - /* Store bridge mode or not */ - bool ipa_bridge_enable; - - /* Store bridge netdev mac */ - uint8_t bridge_mac[IPA_MAC_ADDR_SIZE]; - - /* Store the flt rule count for each producer client*/ - int flt_rule_count_v4[IPA_CLIENT_CONS - IPA_CLIENT_PROD]; - int flt_rule_count_v6[IPA_CLIENT_CONS - IPA_CLIENT_PROD]; - - /* IPACM routing table name for v4/v6 */ - struct ipa_ioc_get_rt_tbl rt_tbl_lan_v4, rt_tbl_wan_v4, rt_tbl_default_v4, rt_tbl_v6, rt_tbl_wan_v6; - struct ipa_ioc_get_rt_tbl rt_tbl_wan_dl; - struct ipa_ioc_get_rt_tbl rt_tbl_odu_v4, rt_tbl_odu_v6; - - bool isMCC_Mode; - - /* To return the instance */ - static IPACM_Config* GetInstance(); - - const char* getEventName(ipa_cm_event_id event_id); - - inline void increaseFltRuleCount(int index, ipa_ip_type iptype, int increment) - { - if((index >= IPA_CLIENT_CONS - IPA_CLIENT_PROD) || (index < 0)) - { - IPACMERR("Index is out of range: %d.\n", index); - return; - } - if(iptype == IPA_IP_v4) - { - flt_rule_count_v4[index] += increment; - IPACMDBG_H("Now num of v4 flt rules on client %d is %d.\n", index, flt_rule_count_v4[index]); - } - else - { - flt_rule_count_v6[index] += increment; - IPACMDBG_H("Now num of v6 flt rules on client %d is %d.\n", index, flt_rule_count_v6[index]); - } - return; - } - - inline void decreaseFltRuleCount(int index, ipa_ip_type iptype, int decrement) - { - if((index >= IPA_CLIENT_CONS - IPA_CLIENT_PROD) || (index < 0)) - { - IPACMERR("Index is out of range: %d.\n", index); - return; - } - if(iptype == IPA_IP_v4) - { - flt_rule_count_v4[index] -= decrement; - IPACMDBG_H("Now num of v4 flt rules on client %d is %d.\n", index, flt_rule_count_v4[index]); - } - else - { - flt_rule_count_v6[index] -= decrement; - IPACMDBG_H("Now num of v6 flt rules on client %d is %d.\n", index, flt_rule_count_v6[index]); - } - return; - } - - inline int getFltRuleCount(int index, ipa_ip_type iptype) - { - if((index >= IPA_CLIENT_CONS - IPA_CLIENT_PROD) || (index < 0)) - { - IPACMERR("Index is out of range: %d.\n", index); - return -1; - } - if(iptype == IPA_IP_v4) - { - return flt_rule_count_v4[index]; - } - else - { - return flt_rule_count_v6[index]; - } - } - - inline int GetAlgPortCnt() - { - return ipa_num_alg_ports; - } - - int GetAlgPorts(int nPorts, ipacm_alg *pAlgPorts); - - inline int GetNatMaxEntries(void) - { - return ipa_nat_max_entries; - } - - inline int GetNatIfacesCnt() - { - return ipa_nat_iface_entries; - } - int GetNatIfaces(int nPorts, NatIfaces *ifaces); - - /* for IPACM resource manager dependency usage */ - void AddRmDepend(ipa_rm_resource_name rm1,bool rx_bypass_ipa); - - void DelRmDepend(ipa_rm_resource_name rm1); - - int AddNatIfaces(char *dev_name); - - int DelNatIfaces(char *dev_name); - - inline void SetQmapId(uint8_t id) - { - qmap_id = id; - } - - inline uint8_t GetQmapId() - { - return qmap_id; - } - - int SetExtProp(ipa_ioc_query_intf_ext_props *prop); - - ipacm_ext_prop* GetExtProp(ipa_ip_type ip_type); - - int DelExtProp(ipa_ip_type ip_type); - - int Init(void); - - inline bool isPrivateSubnet(uint32_t ip_addr) - { - for(int cnt=0; cnt<ipa_num_private_subnet; cnt++) - { - if(private_subnet_table[cnt].subnet_addr == - (private_subnet_table[cnt].subnet_mask & ip_addr)) - { - return true; - } - } - - return false; - } -#ifdef FEATURE_IPA_ANDROID - inline bool AddPrivateSubnet(uint32_t ip_addr, int ipa_if_index) - { - ipacm_cmd_q_data evt_data; - ipacm_event_data_fid *data_fid; - uint32_t subnet_mask = ~0; - for(int cnt=0; cnt<ipa_num_private_subnet; cnt++) - { - if(private_subnet_table[cnt].subnet_addr == ip_addr) - { - IPACMDBG("Already has private subnet_addr as: 0x%x in entry(%d) \n", ip_addr, cnt); - return true; - } - } - - if(ipa_num_private_subnet < IPA_MAX_PRIVATE_SUBNET_ENTRIES) - { - IPACMDBG("Add IPACM private subnet_addr as: 0x%x in entry(%d) \n", ip_addr, ipa_num_private_subnet); - private_subnet_table[ipa_num_private_subnet].subnet_addr = ip_addr; - private_subnet_table[ipa_num_private_subnet].subnet_mask = (subnet_mask >> 8) << 8; - ipa_num_private_subnet++; - - /* IPACM private subnet set changes */ - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return IPACM_FAILURE; - } - data_fid->if_index = ipa_if_index; // already ipa index, not fid index - evt_data.event = IPA_PRIVATE_SUBNET_CHANGE_EVENT; - evt_data.evt_data = data_fid; - - /* Insert IPA_PRIVATE_SUBNET_CHANGE_EVENT to command queue */ - IPACM_EvtDispatcher::PostEvt(&evt_data); - return true; - } - IPACMERR("IPACM private subnet_addr overflow, total entry(%d)\n", ipa_num_private_subnet); - return false; - } - - inline bool DelPrivateSubnet(uint32_t ip_addr, int ipa_if_index) - { - ipacm_cmd_q_data evt_data; - ipacm_event_data_fid *data_fid; - for(int cnt=0; cnt<ipa_num_private_subnet; cnt++) - { - if(private_subnet_table[cnt].subnet_addr == ip_addr) - { - IPACMDBG("Found private subnet_addr as: 0x%x in entry(%d) \n", ip_addr, cnt); - for (; cnt < ipa_num_private_subnet - 1; cnt++) - { - private_subnet_table[cnt].subnet_addr = private_subnet_table[cnt+1].subnet_addr; - } - ipa_num_private_subnet = ipa_num_private_subnet - 1; - - /* IPACM private subnet set changes */ - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return IPACM_FAILURE; - } - data_fid->if_index = ipa_if_index; // already ipa index, not fid index - evt_data.event = IPA_PRIVATE_SUBNET_CHANGE_EVENT; - evt_data.evt_data = data_fid; - - /* Insert IPA_PRIVATE_SUBNET_CHANGE_EVENT to command queue */ - IPACM_EvtDispatcher::PostEvt(&evt_data); - return true; - } - } - IPACMDBG("can't find private subnet_addr as: 0x%x \n", ip_addr); - return false; - } -#endif /* defined(FEATURE_IPA_ANDROID)*/ - - static const char *DEVICE_NAME_ODU; - -private: - static IPACM_Config *pInstance; - static const char *DEVICE_NAME; - IPACM_Config(void); - int m_fd; /* File descriptor of the IPA device node /dev/ipa */ - uint8_t qmap_id; - ipacm_ext_prop ext_prop_v4; - ipacm_ext_prop ext_prop_v6; -}; - -#endif /* IPACM_CONFIG */ diff --git a/ipacm/inc/IPACM_ConntrackClient.h b/ipacm/inc/IPACM_ConntrackClient.h deleted file mode 100644 index a6076cf..0000000 --- a/ipacm/inc/IPACM_ConntrackClient.h +++ /dev/null @@ -1,104 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IPACM_CONNTRACK_FILTER_H -#define IPACM_CONNTRACK_FILTER_H - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <arpa/inet.h> -#include <netinet/in.h> -#include <errno.h> - -#include "IPACM_ConntrackClient.h" -#include "IPACM_CmdQueue.h" -#include "IPACM_Conntrack_NATApp.h" -#include "IPACM_EvtDispatcher.h" -#include "IPACM_Defs.h" - -#ifndef IPACM_DEBUG -#define IPACM_DEBUG -#endif - -extern "C" -{ -#include <libnetfilter_conntrack/libnetfilter_conntrack.h> -#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h> -#include <sys/inotify.h> -} - -using namespace std; - -#define UDP_TIMEOUT_UPDATE 20 -#define BROADCAST_IPV4_ADDR 0xFFFFFFFF - -class IPACM_ConntrackClient -{ - -private: - static IPACM_ConntrackClient *pInstance; - - struct nfct_handle *tcp_hdl; - struct nfct_handle *udp_hdl; - struct nfct_filter *tcp_filter; - struct nfct_filter *udp_filter; - static int IPA_Conntrack_Filters_Ignore_Local_Addrs(struct nfct_filter *filter); - static int IPA_Conntrack_Filters_Ignore_Bridge_Addrs(struct nfct_filter *filter); - static int IPA_Conntrack_Filters_Ignore_Local_Iface(struct nfct_filter *, ipacm_event_iface_up *); - IPACM_ConntrackClient(); - -public: - static int IPAConntrackEventCB(enum nf_conntrack_msg_type type, - struct nf_conntrack *ct, - void *data); - - static int IPA_Conntrack_UDP_Filter_Init(void); - static int IPA_Conntrack_TCP_Filter_Init(void); - static void* TCPRegisterWithConnTrack(void *); - static void* UDPRegisterWithConnTrack(void *); - static void* UDPConnTimeoutUpdate(void *); - - static void UpdateUDPFilters(void *, bool); - static void UpdateTCPFilters(void *, bool); - static void Read_TcpUdp_Timeout(char *in, int len); - - static IPACM_ConntrackClient* GetInstance(); - -#ifdef IPACM_DEBUG -#define iptodot(X,Y) \ - IPACMLOG(" %s(0x%x): %d.%d.%d.%d\n", X, Y, ((Y>>24) & 0xFF), ((Y>>16) & 0xFF), ((Y>>8) & 0xFF), (Y & 0xFF)); -#endif - -#define log_nat(A,B,C,D,E,F) \ - IPACMDBG_H("protocol %d Private IP: %d.%d.%d.%d\t Target IP: %d.%d.%d.%d\t private port: %d public port: %d %s",A,((B>>24) & 0xFF), ((B>>16) & 0xFF), ((B>>8) & 0xFF), (B & 0xFF), ((C>>24) & 0xFF), ((C>>16) & 0xFF),((C>>8) & 0xFF),(C & 0xFF),D,E,F); - -}; - -#endif /* IPACM_CONNTRACK_FILTER_H */ diff --git a/ipacm/inc/IPACM_ConntrackListener.h b/ipacm/inc/IPACM_ConntrackListener.h deleted file mode 100644 index cdf3ef5..0000000 --- a/ipacm/inc/IPACM_ConntrackListener.h +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IPACM_CONNTRACK_LISTENER -#define IPACM_CONNTRACK_LISTENER - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> - -#include <arpa/inet.h> -#include <netinet/in.h> -#include <errno.h> - -#include "IPACM_CmdQueue.h" -#include "IPACM_Conntrack_NATApp.h" -#include "IPACM_Listener.h" -#ifdef CT_OPT -#include "IPACM_LanToLan.h" -#endif - -#define MAX_IFACE_ADDRESS 50 -#define MAX_STA_CLNT_IFACES 10 -#define STA_CLNT_SUBNET_MASK 0xFFFFFF00 - -using namespace std; - -typedef struct _nat_entry_bundle -{ - struct nf_conntrack *ct; - enum nf_conntrack_msg_type type; - nat_table_entry *rule; - bool isTempEntry; - -}nat_entry_bundle; - -class IPACM_ConntrackListener : public IPACM_Listener -{ - -private: - bool isCTReg; - bool isNatThreadStart; - bool WanUp; - NatApp *nat_inst; - - int NatIfaceCnt; - int StaClntCnt; - NatIfaces *pNatIfaces; - uint32_t nat_iface_ipv4_addr[MAX_IFACE_ADDRESS]; - uint32_t nonnat_iface_ipv4_addr[MAX_IFACE_ADDRESS]; - uint32_t sta_clnt_ipv4_addr[MAX_STA_CLNT_IFACES]; - IPACM_Config *pConfig; -#ifdef CT_OPT - IPACM_LanToLan *p_lan2lan; -#endif - - void ProcessCTMessage(void *); - void ProcessTCPorUDPMsg(struct nf_conntrack *, - enum nf_conntrack_msg_type, u_int8_t); - void TriggerWANUp(void *); - void TriggerWANDown(uint32_t); - int CreateNatThreads(void); - int CreateConnTrackThreads(void); - bool AddIface(nat_table_entry *, bool *); - void AddORDeleteNatEntry(const nat_entry_bundle *); - void PopulateTCPorUDPEntry(struct nf_conntrack *, uint32_t, nat_table_entry *); - void CheckSTAClient(const nat_table_entry *, bool *); - int CheckNatIface(ipacm_event_data_all *, bool *); - void HandleNonNatIPAddr(void *, bool); - -#ifdef CT_OPT - void ProcessCTV6Message(void *); - void HandleLan2Lan(struct nf_conntrack *, - enum nf_conntrack_msg_type, nat_table_entry* ); -#endif - -public: - char wan_ifname[IPA_IFACE_NAME_LEN]; - uint32_t wan_ipaddr; - bool isStaMode; - IPACM_ConntrackListener(); - void event_callback(ipa_cm_event_id, void *data); - inline bool isWanUp() - { - return WanUp; - } - - void HandleNeighIpAddrAddEvt(ipacm_event_data_all *); - void HandleNeighIpAddrDelEvt(uint32_t); - void HandleSTAClientAddEvt(uint32_t); - void HandleSTAClientDelEvt(uint32_t); -}; - -extern IPACM_ConntrackListener *CtList; - -#endif /* IPACM_CONNTRACK_LISTENER */ diff --git a/ipacm/inc/IPACM_Conntrack_NATApp.h b/ipacm/inc/IPACM_Conntrack_NATApp.h deleted file mode 100644 index e50b316..0000000 --- a/ipacm/inc/IPACM_Conntrack_NATApp.h +++ /dev/null @@ -1,133 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#ifndef IPACM_CONNTRACK_NATAPP_H -#define IPACM_CONNTRACK_NATAPP_H - -#include <string.h> /* for stderror */ -#include <stdlib.h> -#include <cstdio> /* for perror */ - -#include "IPACM_Config.h" -#include "IPACM_Xml.h" - -extern "C" -{ -#include <libnetfilter_conntrack/libnetfilter_conntrack.h> -#include <ipa_nat_drv.h> -} - -#define MAX_TEMP_ENTRIES 25 - -#define IPACM_TCP_FULL_FILE_NAME "/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established" -#define IPACM_UDP_FULL_FILE_NAME "/proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream" - -typedef struct _nat_table_entry -{ - uint32_t private_ip; - uint16_t private_port; - - uint32_t target_ip; - uint16_t target_port; - - uint32_t public_ip; - uint16_t public_port; - - u_int8_t protocol; - uint32_t timestamp; - - bool dst_nat; - bool enabled; - uint32_t rule_hdl; - -}nat_table_entry; - -#define CHK_TBL_HDL() if(nat_table_hdl == 0){ return -1; } - -class NatApp -{ -private: - - static NatApp *pInstance; - - nat_table_entry *cache; - nat_table_entry temp[MAX_TEMP_ENTRIES]; - uint32_t pub_ip_addr; - uint32_t pub_ip_addr_pre; - uint32_t nat_table_hdl; - - int curCnt, max_entries; - - ipacm_alg *pALGPorts; - uint16_t nALGPort; - - uint32_t tcp_timeout; - uint32_t udp_timeout; - - uint32_t PwrSaveIfs[IPA_MAX_NUM_WIFI_CLIENTS]; - - struct nf_conntrack *ct; - struct nfct_handle *ct_hdl; - - NatApp(); - int Init(); - - void UpdateCTUdpTs(nat_table_entry *, uint32_t); - bool ChkForDup(const nat_table_entry *); - bool isAlgPort(uint8_t, uint16_t); - void Reset(); - bool isPwrSaveIf(uint32_t); - -public: - static NatApp* GetInstance(); - - int AddTable(uint32_t); - uint32_t GetTableHdl(uint32_t); - int DeleteTable(uint32_t); - - int AddEntry(const nat_table_entry *); - int DeleteEntry(const nat_table_entry *); - - void UpdateUDPTimeStamp(); - - int UpdatePwrSaveIf(uint32_t); - int ResetPwrSaveIf(uint32_t); - int DelEntriesOnClntDiscon(uint32_t); - int DelEntriesOnSTAClntDiscon(uint32_t); - - void Read_TcpUdp_Timeout(void); - - void AddTempEntry(const nat_table_entry *); - void CacheEntry(const nat_table_entry *); - void DeleteTempEntry(const nat_table_entry *); - void FlushTempEntries(uint32_t, bool, bool isDummy = false); -}; - - - -#endif /* IPACM_CONNTRACK_NATAPP_H */ diff --git a/ipacm/inc/IPACM_Defs.h b/ipacm/inc/IPACM_Defs.h deleted file mode 100644 index d2cc362..0000000 --- a/ipacm/inc/IPACM_Defs.h +++ /dev/null @@ -1,354 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Defs.h - - @brief - This file implements the common definitions amon all ifaces. - - @Author - Skylar Chang - -*/ -#ifndef IPA_CM_DEFS_H -#define IPA_CM_DEFS_H - -#include <unistd.h> -#include <fcntl.h> -#include <linux/msm_ipa.h> -#include "IPACM_Log.h" - -#ifdef USE_GLIB -#include <glib.h> -#define strlcpy g_strlcpy -#define strlcat g_strlcat -#endif - -extern "C" -{ -#include <libnetfilter_conntrack/libnetfilter_conntrack.h> -#include <libnetfilter_conntrack/libnetfilter_conntrack_tcp.h> -} - -#define IF_NAME_LEN 16 -#define IPA_MAX_FILE_LEN 64 -#define IPA_IFACE_NAME_LEN 16 -#define IPA_ALG_PROTOCOL_NAME_LEN 10 - -#define IPA_WLAN_PARTIAL_HDR_OFFSET 0 // dst mac first then src mac -#define IPA_ODU_PARTIAL_HDR_OFFSET 8 // dst mac first then src mac -#define IPA_WLAN_PARTIAL_HDR_NAME_v4 "IEEE802_3_v4" -#define IPA_WLAN_PARTIAL_HDR_NAME_v6 "IEEE802_3_v6" -#define IPA_DUMMY_ETH_HDR_NAME_v6 "ETH_dummy_v6" -#define IPA_WAN_PARTIAL_HDR_NAME_v4 "IEEE802_3_STA_v4" -#define IPA_WAN_PARTIAL_HDR_NAME_v6 "IEEE802_3_STA_v6" -#define IPA_ETH_HDR_NAME_v4 "IPACM_ETH_v4" -#define IPA_ETH_HDR_NAME_v6 "IPACM_ETH_v6" -#define IPA_ODU_HDR_NAME_v4 "IPACM_ODU_v4" -#define IPA_ODU_HDR_NAME_v6 "IPACM_ODU_v6" - - -#define IPA_MAX_IFACE_ENTRIES 20 -#define IPA_MAX_PRIVATE_SUBNET_ENTRIES 3 -#define IPA_MAX_ALG_ENTRIES 20 -#define IPA_MAX_RM_ENTRY 6 - -#define IPV4_ADDR_LINKLOCAL 0xA9FE0000 -#define IPV4_ADDR_LINKLOCAL_MASK 0xFFFF0000 - -#define V4_DEFAULT_ROUTE_TABLE_NAME "ipa_dflt_rt" -#define V4_LAN_ROUTE_TABLE_NAME "COMRTBLLANv4" -#define V4_WAN_ROUTE_TABLE_NAME "WANRTBLv4" -#define WAN_DL_ROUTE_TABLE_NAME "ipa_dflt_wan_rt" -#define V6_COMMON_ROUTE_TABLE_NAME "COMRTBLv6" -#define V6_WAN_ROUTE_TABLE_NAME "WANRTBLv6" -#define V4_ODU_ROUTE_TABLE_NAME "ODURTBLv4" -#define V6_ODU_ROUTE_TABLE_NAME "ODURTBLv6" - -#define WWAN_QMI_IOCTL_DEVICE_NAME "/dev/wwan_ioctl" -#define IPA_DEVICE_NAME "/dev/ipa" -#define MAX_NUM_PROP 2 - -#ifndef FEATURE_IPA_V3 -#define IPA_MAX_FLT_RULE 50 -#else -#define IPA_MAX_FLT_RULE 100 -#endif - -#define TCP_FIN_SHIFT 16 -#define TCP_SYN_SHIFT 17 -#define TCP_RST_SHIFT 18 -#define NUM_IPV6_PREFIX_FLT_RULE 1 - -/*--------------------------------------------------------------------------- - Return values indicating error status ----------------------------------------------------------------------------*/ - -#define IPACM_SUCCESS 0 /* Successful operation */ -#define IPACM_FAILURE -1 /* Unsuccessful operation */ - -#define IPACM_IP_NULL (ipa_ip_type)0xFF -#define IPACM_INVALID_INDEX (ipa_ip_type)0xFF - -#define IPA_MAX_NUM_WIFI_CLIENTS 32 -#define IPA_MAX_NUM_WAN_CLIENTS 10 -#define IPA_MAX_NUM_ETH_CLIENTS 15 -#define IPA_MAX_NUM_AMPDU_RULE 15 -#define IPA_MAC_ADDR_SIZE 6 - -/*=========================================================================== - GLOBAL DEFINITIONS AND DECLARATIONS -===========================================================================*/ -typedef enum -{ - IPA_CFG_CHANGE_EVENT, /* NULL */ - IPA_PRIVATE_SUBNET_CHANGE_EVENT, /* ipacm_event_data_fid */ - IPA_FIREWALL_CHANGE_EVENT, /* NULL */ - IPA_LINK_UP_EVENT, /* ipacm_event_data_fid */ - IPA_LINK_DOWN_EVENT, /* ipacm_event_data_fid */ - IPA_USB_LINK_UP_EVENT, /* ipacm_event_data_fid */ - IPA_BRIDGE_LINK_UP_EVENT, /* ipacm_event_data_all */ - IPA_WAN_EMBMS_LINK_UP_EVENT, /* ipacm_event_data_mac */ - IPA_ADDR_ADD_EVENT, /* ipacm_event_data_addr */ - IPA_ADDR_DEL_EVENT, /* no use */ - IPA_ROUTE_ADD_EVENT, /* ipacm_event_data_addr */ - IPA_ROUTE_DEL_EVENT, /* ipacm_event_data_addr */ - IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, /* ipacm_event_data_fid */ - IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT, /* ipacm_event_data_fid */ - IPA_WLAN_AP_LINK_UP_EVENT, /* ipacm_event_data_mac */ - IPA_WLAN_STA_LINK_UP_EVENT, /* ipacm_event_data_mac */ - IPA_WLAN_LINK_DOWN_EVENT, /* ipacm_event_data_mac */ - IPA_WLAN_CLIENT_ADD_EVENT, /* ipacm_event_data_mac */ - IPA_WLAN_CLIENT_ADD_EVENT_EX, /* ipacm_event_data_wlan_ex */ - IPA_WLAN_CLIENT_DEL_EVENT, /* ipacm_event_data_mac */ - IPA_WLAN_CLIENT_POWER_SAVE_EVENT, /* ipacm_event_data_mac */ - IPA_WLAN_CLIENT_RECOVER_EVENT, /* ipacm_event_data_mac */ - IPA_NEW_NEIGH_EVENT, /* ipacm_event_data_all */ - IPA_DEL_NEIGH_EVENT, /* ipacm_event_data_all */ - IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, /* ipacm_event_data_all */ - IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, /* ipacm_event_data_all */ - IPA_SW_ROUTING_ENABLE, /* NULL */ - IPA_SW_ROUTING_DISABLE, /* NULL */ - IPA_PROCESS_CT_MESSAGE, /* ipacm_ct_evt_data */ - IPA_PROCESS_CT_MESSAGE_V6, /* ipacm_ct_evt_data */ - IPA_LAN_TO_LAN_NEW_CONNECTION, /* ipacm_event_connection */ - IPA_LAN_TO_LAN_DEL_CONNECTION, /* ipacm_event_connection */ - IPA_WLAN_SWITCH_TO_SCC, /* No Data */ - IPA_WLAN_SWITCH_TO_MCC, /* No Data */ - IPA_CRADLE_WAN_MODE_SWITCH, /* ipacm_event_cradle_wan_mode */ - IPA_WAN_XLAT_CONNECT_EVENT, /* ipacm_event_data_fid */ - IPA_TETHERING_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */ - IPA_NETWORK_STATS_UPDATE_EVENT, /* ipacm_event_data_fid */ - - IPA_EXTERNAL_EVENT_MAX, - - IPA_HANDLE_WAN_UP, /* ipacm_event_iface_up */ - IPA_HANDLE_WAN_DOWN, /* ipacm_event_iface_up */ - IPA_HANDLE_WAN_UP_V6, /* NULL */ - IPA_HANDLE_WAN_DOWN_V6, /* NULL */ - IPA_HANDLE_WAN_UP_TETHER, /* ipacm_event_iface_up_tehter */ - IPA_HANDLE_WAN_DOWN_TETHER, /* ipacm_event_iface_up_tehter */ - IPA_HANDLE_WAN_UP_V6_TETHER, /* ipacm_event_iface_up_tehter */ - IPA_HANDLE_WAN_DOWN_V6_TETHER, /* ipacm_event_iface_up_tehter */ - IPA_HANDLE_WLAN_UP, /* ipacm_event_iface_up */ - IPA_HANDLE_LAN_UP, /* ipacm_event_iface_up */ - IPA_ETH_BRIDGE_IFACE_UP, /* ipacm_event_eth_bridge*/ - IPA_ETH_BRIDGE_IFACE_DOWN, /* ipacm_event_eth_bridge*/ - IPA_ETH_BRIDGE_CLIENT_ADD, /* ipacm_event_eth_bridge */ - IPA_ETH_BRIDGE_CLIENT_DEL, /* ipacm_event_eth_bridge*/ - IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, /* ipacm_event_eth_bridge*/ - IPA_LAN_DELETE_SELF, /* ipacm_event_data_fid */ - IPACM_EVENT_MAX -} ipa_cm_event_id; - -typedef struct -{ - uint8_t num_rule; - uint32_t rule_hdl[MAX_NUM_PROP]; -} lan_to_lan_rt_rule_hdl; - -typedef enum -{ - LAN_IF = 0, - WLAN_IF, - WAN_IF, - VIRTUAL_IF, - ETH_IF, - EMBMS_IF, - ODU_IF, - UNKNOWN_IF -} ipacm_iface_type; - -typedef enum -{ - ROUTER = 0, - BRIDGE -} ipacm_cradle_iface_mode; - -typedef enum -{ - FULL, - INTERNET -} ipacm_wlan_access_mode; - -typedef struct -{ - struct nf_conntrack *ct; - enum nf_conntrack_msg_type type; -}ipacm_ct_evt_data; - -typedef struct -{ - char iface_name[IPA_IFACE_NAME_LEN]; - ipacm_iface_type if_cat; - ipacm_cradle_iface_mode if_mode; - ipacm_wlan_access_mode wlan_mode; - int netlink_interface_index; -} ipa_ifi_dev_name_t; - -typedef struct -{ - uint32_t subnet_addr; - uint32_t subnet_mask; -} ipa_private_subnet; - - -typedef struct _ipacm_event_data_all -{ - enum ipa_ip_type iptype; - int if_index; - uint32_t ipv4_addr; - uint32_t ipv6_addr[4]; - uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; -} ipacm_event_data_all; - -class IPACM_Lan; - -typedef struct -{ - ipacm_cradle_iface_mode cradle_wan_mode; -} ipacm_event_cradle_wan_mode; - -typedef struct -{ - IPACM_Lan *p_iface; - ipa_ip_type iptype; - uint8_t mac_addr[6]; -} ipacm_event_eth_bridge; - -typedef struct -{ - enum ipa_ip_type iptype; - uint32_t src_ipv4_addr; - uint32_t dst_ipv4_addr; - uint32_t src_ipv6_addr[4]; - uint32_t dst_ipv6_addr[4]; -} ipacm_event_connection; - -typedef struct _ipacm_event_data_fid -{ - int if_index; -} ipacm_event_data_fid; - -typedef struct -{ - ipacm_iface_type if_cat; -} ipacm_event_data_if_cat; - -typedef struct _ipacm_event_data_iptype -{ - int if_index; - int if_index_tether; - enum ipa_ip_type iptype; -#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN - uint32_t ipv4_addr_gw; - uint32_t ipv6_addr_gw[4]; -#endif -} ipacm_event_data_iptype; - - -typedef struct _ipacm_event_data_addr -{ - enum ipa_ip_type iptype; - int if_index; - uint32_t ipv4_addr_gw; - uint32_t ipv4_addr; - uint32_t ipv4_addr_mask; - uint32_t ipv6_addr[4]; - uint32_t ipv6_addr_mask[4]; - uint32_t ipv6_addr_gw[4]; -} ipacm_event_data_addr; - -typedef struct _ipacm_event_data_mac -{ - int if_index; - int ipa_if_cate; - uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; -} ipacm_event_data_mac; - -typedef struct -{ - int if_index; - uint8_t num_of_attribs; - struct ipa_wlan_hdr_attrib_val attribs[0]; -} ipacm_event_data_wlan_ex; - -typedef struct _ipacm_event_iface_up -{ - char ifname[IPA_IFACE_NAME_LEN]; - uint32_t ipv4_addr; - uint32_t addr_mask; - uint32_t ipv6_prefix[2]; - bool is_sta; - uint8_t xlat_mux_id; -}ipacm_event_iface_up; - -typedef struct _ipacm_event_iface_up_tether -{ - uint32_t if_index_tether; - uint32_t ipv6_prefix[2]; - bool is_sta; -}ipacm_event_iface_up_tehter; - -typedef enum -{ - Q6_WAN = 0, - WLAN_WAN, - ECM_WAN -} ipacm_wan_iface_type; - -typedef struct _ipacm_ifacemgr_data -{ - int if_index; - ipacm_wan_iface_type if_type; - uint8_t mac_addr[IPA_MAC_ADDR_SIZE]; -}ipacm_ifacemgr_data; - -#endif /* IPA_CM_DEFS_H */ diff --git a/ipacm/inc/IPACM_EvtDispatcher.h b/ipacm/inc/IPACM_EvtDispatcher.h deleted file mode 100644 index 550f4d4..0000000 --- a/ipacm/inc/IPACM_EvtDispatcher.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - @file - IPACM_EvtDispatcher.h - - @brief - This file implements the IPAM event dispatcher definitions - - @Author - -*/ -#ifndef IPACM_EvtDispatcher_H -#define IPACM_EvtDispatcher_H - -#include <stdio.h> -#include <IPACM_CmdQueue.h> -#include "IPACM_Defs.h" -#include "IPACM_Listener.h" - -/* queue */ -typedef struct _cmd_evts -{ - ipa_cm_event_id event; - IPACM_Listener *obj; - //int ipa_interface_index; - _cmd_evts *next; -} cmd_evts; - - - -class IPACM_EvtDispatcher -{ -public: - - /* api for all iface instances to register events */ - static int registr(ipa_cm_event_id event, IPACM_Listener *obj); - - /* api for all iface instances to de-register events */ - static int deregistr(IPACM_Listener *obj); - - static int PostEvt(ipacm_cmd_q_data *); - static void ProcessEvt(ipacm_cmd_q_data *); - -private: - static cmd_evts *head; -}; - -#endif /* IPACM_EvtDispatcher_H */ diff --git a/ipacm/inc/IPACM_Filtering.h b/ipacm/inc/IPACM_Filtering.h deleted file mode 100644 index 9bb8247..0000000 --- a/ipacm/inc/IPACM_Filtering.h +++ /dev/null @@ -1,76 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/*! - @file - IPACM_Filtering.h - - @brief - This file implements the IPACM filtering definitions - - @Author - Skylar Chang - -*/ - -#ifndef IPACM_FILTERING_H -#define IPACM_FILTERING_H - -#include <stdint.h> -#include <linux/msm_ipa.h> -#include <IPACM_Defs.h> -#include <linux/rmnet_ipa_fd_ioctl.h> - -class IPACM_Filtering -{ -public: - IPACM_Filtering(); - ~IPACM_Filtering(); - bool AddFilteringRule(struct ipa_ioc_add_flt_rule const *ruleTable); - bool AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after const *ruleTable); - bool DeleteFilteringRule(struct ipa_ioc_del_flt_rule *ruleTable); - bool Commit(enum ipa_ip_type ip); - bool Reset(enum ipa_ip_type ip); - bool DeviceNodeIsOpened(); - bool DeleteFilteringHdls(uint32_t *flt_rule_hdls, - ipa_ip_type ip, - uint8_t num_rules); - - bool AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *rule_table_v4, struct ipa_ioc_add_flt_rule const * rule_table_v6, uint8_t mux_id); - bool SendFilteringRuleIndex(struct ipa_fltr_installed_notif_req_msg_v01* table); - bool ModifyFilteringRule(struct ipa_ioc_mdfy_flt_rule* ruleTable); - ipa_filter_action_enum_v01 GetQmiFilterAction(ipa_flt_action action); - -private: - static const char *DEVICE_NAME; - int fd; /* File descriptor of the IPA device node /dev/ipa */ -}; - -#endif //IPACM_FILTERING_H - diff --git a/ipacm/inc/IPACM_Header.h b/ipacm/inc/IPACM_Header.h deleted file mode 100644 index 027c8ff..0000000 --- a/ipacm/inc/IPACM_Header.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * IPACM_Header.h - * - * Created on: Jun 20, 2012 - * Author: tatias - */ - -////////////////////////////////////////////////////////////////////////////////// - -#ifndef IPACM_HEADER_H -#define IPACM_HEADER_H - -#include <stdint.h> -#include "linux/msm_ipa.h" - -////////////////////////////////////////////////////////////////////////////////// - -class IPACM_Header -{ -private: - int m_fd; -public: - bool AddHeader(struct ipa_ioc_add_hdr *pHeaderTable); - bool DeleteHeader(struct ipa_ioc_del_hdr *pHeaderTable); - bool GetHeaderHandle(struct ipa_ioc_get_hdr *pHeaderStruct); - bool CopyHeader(struct ipa_ioc_copy_hdr *pCopyHeaderStruct); - bool Commit(); - bool Reset(); - bool DeleteHeaderHdl(uint32_t hdr_hdl); - bool AddHeaderProcCtx(struct ipa_ioc_add_hdr_proc_ctx* pHeader); - bool DeleteHeaderProcCtx(uint32_t hdl); - - IPACM_Header(); - ~IPACM_Header(); - bool DeviceNodeIsOpened(); -}; - - -#endif - - diff --git a/ipacm/inc/IPACM_Iface.h b/ipacm/inc/IPACM_Iface.h deleted file mode 100644 index 43b0da6..0000000 --- a/ipacm/inc/IPACM_Iface.h +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_iface.h - - @brief - This file implements the basis Iface definitions. - - @Author - Skylar Chang - -*/ -#ifndef IPACM_IFACE_H -#define IPACM_IFACE_H - -#include <stdio.h> -#include <IPACM_CmdQueue.h> -#include <linux/msm_ipa.h> -#include "IPACM_Routing.h" -#include "IPACM_Filtering.h" -#include "IPACM_Header.h" -#include "IPACM_EvtDispatcher.h" -#include "IPACM_Xml.h" -#include "IPACM_Log.h" -#include "IPACM_Config.h" -#include "IPACM_Defs.h" -#include <string.h> - -/* current support 2 ipv6-address*/ -#define MAX_DEFAULT_v4_ROUTE_RULES 1 -#define MAX_DEFAULT_v6_ROUTE_RULES 2 -#define IPV4_DEFAULT_FILTERTING_RULES 3 - -#ifdef FEATURE_IPA_ANDROID -#define IPV6_DEFAULT_FILTERTING_RULES 6 -#else -#define IPV6_DEFAULT_FILTERTING_RULES 3 -#endif - -#define IPV6_DEFAULT_LAN_FILTERTING_RULES 1 -#define IPV6_NUM_ADDR 3 -#define MAX_SOFTWAREROUTING_FILTERTING_RULES 2 -#define INVALID_IFACE -1 - -/* iface */ -class IPACM_Iface :public IPACM_Listener -{ -public: - - /* Static class for reading IPACM configuration from XML file*/ - static IPACM_Config *ipacmcfg; - - /* IPACM interface id */ - int ipa_if_num; - - /* IPACM interface category */ - ipacm_iface_type ipa_if_cate; - - /* IPACM interface name */ - char dev_name[IF_NAME_LEN]; - - /* IPACM interface iptype v4, v6 or both */ - ipa_ip_type ip_type; - - /* IPACM interface v6 ip-address*/ - uint32_t ipv6_addr[MAX_DEFAULT_v6_ROUTE_RULES][4]; - - uint32_t software_routing_fl_rule_hdl[MAX_SOFTWAREROUTING_FILTERTING_RULES]; - - bool softwarerouting_act; - - /* IPACM number of default route rules for ipv6*/ - int num_dft_rt_v6; - - uint32_t dft_v4fl_rule_hdl[IPV4_DEFAULT_FILTERTING_RULES]; - uint32_t dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES + IPV6_DEFAULT_LAN_FILTERTING_RULES]; - /* create additional set of v6 RT-rules in Wanv6RT table*/ - uint32_t dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+2*MAX_DEFAULT_v6_ROUTE_RULES]; - - ipa_ioc_query_intf *iface_query; - ipa_ioc_query_intf_tx_props *tx_prop; - ipa_ioc_query_intf_rx_props *rx_prop; - - virtual int handle_down_evt() = 0; - - virtual int handle_addr_evt(ipacm_event_data_addr *data) = 0; - - IPACM_Iface(int iface_index); - - virtual void event_callback(ipa_cm_event_id event, - void *data) = 0; - - /* Query ipa_interface_index by given linux interface_index */ - static int iface_ipa_index_query(int interface_index); - - /* Query ipa_interface ipv4_addr by given linux interface_index */ - static void iface_addr_query(int interface_index); - - /*Query the IPA endpoint property */ - int query_iface_property(void); - - /*Configure the initial filter rules */ - virtual int init_fl_rule(ipa_ip_type iptype); - - /* Change IP Type.*/ - void config_ip_type(ipa_ip_type iptype); - - /* Get interface index */ - virtual int ipa_get_if_index(char * if_name, int * if_index); - - static IPACM_Routing m_routing; - static IPACM_Filtering m_filtering; - static IPACM_Header m_header; - - /* software routing enable */ - virtual int handle_software_routing_enable(void); - - /* software routing disable */ - virtual int handle_software_routing_disable(void); - -private: - - static const char *DEVICE_NAME; -}; - -#endif /* IPACM_IFACE_H */ diff --git a/ipacm/inc/IPACM_IfaceManager.h b/ipacm/inc/IPACM_IfaceManager.h deleted file mode 100644 index c7184f2..0000000 --- a/ipacm/inc/IPACM_IfaceManager.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_IfaceManager.h - - @brief - This file implements the IPAM iface_manager definitions - - @Author - Skylar Chang - -*/ -#ifndef IPACM_IFACEMANAGER_H -#define IPACM_IFACEMANAGER_H - -#include <stdio.h> -#include <IPACM_CmdQueue.h> - -#include "IPACM_Routing.h" -#include "IPACM_Filtering.h" -#include "IPACM_Listener.h" -#include "IPACM_Iface.h" - -#define IPA_INSTANCE_NOT_FOUND 0 -#define IPA_INSTANCE_FOUND 1 - -/* queue */ -typedef struct _iface_instances -{ - /* Linux interface id */ - int ipa_if_index; - IPACM_Listener *obj; - _iface_instances *next; -} iface_instances; - - -class IPACM_IfaceManager : public IPACM_Listener -{ - -public: - - IPACM_IfaceManager(); - - void event_callback(ipa_cm_event_id event, - void *data); - - /* api for all iface instances to de-register instances */ - static int deregistr(IPACM_Listener *param); - - -private: - int create_iface_instance(ipacm_ifacemgr_data *); - - /* api to register instances */ - int registr(int ipa_if_index, IPACM_Listener *obj); - - int SearchInstance(int ipa_if_index); - - static iface_instances *head; - -}; - -#endif /* IPACM_IFACEMANAGER_H */ diff --git a/ipacm/inc/IPACM_Lan.h b/ipacm/inc/IPACM_Lan.h deleted file mode 100644 index 6c54f5e..0000000 --- a/ipacm/inc/IPACM_Lan.h +++ /dev/null @@ -1,390 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Lan.h - - @brief - This file implements the LAN iface definitions - - @Author - Skylar Chang - -*/ -#ifndef IPACM_LAN_H -#define IPACM_LAN_H - -#include <stdio.h> -#include <linux/msm_ipa.h> - -#include "IPACM_CmdQueue.h" -#include "IPACM_Iface.h" -#include "IPACM_Routing.h" -#include "IPACM_Filtering.h" -#include "IPACM_Config.h" -#include "IPACM_Conntrack_NATApp.h" - -#define IPA_WAN_DEFAULT_FILTER_RULE_HANDLES 1 -#define IPA_PRIV_SUBNET_FILTER_RULE_HANDLES 3 -#define IPA_NUM_ODU_ROUTE_RULES 2 -#define MAX_WAN_UL_FILTER_RULES MAX_NUM_EXT_PROPS -#define NUM_IPV4_ICMP_FLT_RULE 1 -#define NUM_IPV6_ICMP_FLT_RULE 1 - -/* ndc bandwidth ipatetherstats <ifaceIn> <ifaceOut> */ -/* <in->out_bytes> <in->out_pkts> <out->in_bytes> <out->in_pkts */ - -#define PIPE_STATS "%s %s %lu %lu %lu %lu" -#define IPA_PIPE_STATS_FILE_NAME "/data/misc/ipa/tether_stats" - -/* store each lan-iface unicast routing rule and its handler*/ -struct ipa_lan_rt_rule -{ - ipa_ip_type ip; - uint32_t v4_addr; - uint32_t v4_addr_mask; - uint32_t v6_addr[4]; - uint32_t rt_rule_hdl[0]; -}; - -/* Support multiple eth client */ -typedef struct _eth_client_rt_hdl -{ - uint32_t eth_rt_rule_hdl_v4; - uint32_t eth_rt_rule_hdl_v6[IPV6_NUM_ADDR]; - uint32_t eth_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR]; -}eth_client_rt_hdl; - -typedef struct _ipa_eth_client -{ - uint8_t mac[IPA_MAC_ADDR_SIZE]; - uint32_t v4_addr; - uint32_t v6_addr[IPV6_NUM_ADDR][4]; - uint32_t hdr_hdl_v4; - uint32_t hdr_hdl_v6; - bool route_rule_set_v4; - int route_rule_set_v6; - bool ipv4_set; - int ipv6_set; - bool ipv4_header_set; - bool ipv6_header_set; - eth_client_rt_hdl eth_rt_hdl[0]; /* depends on number of tx properties */ -}ipa_eth_client; - - -/* lan iface */ -class IPACM_Lan : public IPACM_Iface -{ -public: - - IPACM_Lan(int iface_index); - ~IPACM_Lan(); - - /* store lan's wan-up filter rule handlers */ - uint32_t lan_wan_fl_rule_hdl[IPA_WAN_DEFAULT_FILTER_RULE_HANDLES]; - - /* store private-subnet filter rule handlers */ - uint32_t private_fl_rule_hdl[IPA_MAX_PRIVATE_SUBNET_ENTRIES]; - - /* LAN-iface's callback function */ - void event_callback(ipa_cm_event_id event, void *data); - - virtual int handle_wan_up(ipa_ip_type ip_type); - - /* configure filter rule for wan_up event*/ - virtual int handle_wan_up_ex(ipacm_ext_prop* ext_prop, ipa_ip_type iptype, uint8_t xlat_mux_id); - - /* delete filter rule for wan_down event*/ - virtual int handle_wan_down(bool is_sta_mode); - - /* delete filter rule for wan_down event*/ - virtual int handle_wan_down_v6(bool is_sta_mode); - - /* configure private subnet filter rules*/ - virtual int handle_private_subnet(ipa_ip_type iptype); - - /* handle new_address event*/ - int handle_addr_evt(ipacm_event_data_addr *data); - - int handle_addr_evt_odu_bridge(ipacm_event_data_addr* data); - - int handle_del_ipv6_addr(ipacm_event_data_all *data); - - static bool odu_up; - - /* install UL filter rule from Q6 */ - virtual int handle_uplink_filter_rule(ipacm_ext_prop* prop, ipa_ip_type iptype, uint8_t xlat_mux_id); - - int handle_cradle_wan_mode_switch(bool is_wan_bridge_mode); - - int install_ipv4_icmp_flt_rule(); - - - /* add header processing context and return handle to lan2lan controller */ - int eth_bridge_add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_hdr_type, uint32_t *hdl); - - /* add routing rule and return handle to lan2lan controller */ - int eth_bridge_add_rt_rule(uint8_t *mac, char *rt_tbl_name, uint32_t hdr_proc_ctx_hdl, - ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int *rt_rule_count); - - /* modify routing rule*/ - int eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl, - ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int rt_rule_count); - - /* add filtering rule and return handle to lan2lan controller */ - int eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip_type iptype, uint32_t *flt_rule_hdl); - - /* delete filtering rule */ - int eth_bridge_del_flt_rule(uint32_t flt_rule_hdl, ipa_ip_type iptype); - - /* delete routing rule */ - int eth_bridge_del_rt_rule(uint32_t rt_rule_hdl, ipa_ip_type iptype); - - /* delete header processing context */ - int eth_bridge_del_hdr_proc_ctx(uint32_t hdr_proc_ctx_hdl); - - - -protected: - - int each_client_rt_rule_count[IPA_IP_MAX]; - - uint32_t eth_bridge_flt_rule_offset[IPA_IP_MAX]; - - /* mac address has to be provided for client related events */ - void eth_bridge_post_event(ipa_cm_event_id evt, ipa_ip_type iptype, uint8_t *mac); - - - - virtual int add_dummy_private_subnet_flt_rule(ipa_ip_type iptype); - - int handle_private_subnet_android(ipa_ip_type iptype); - - int reset_to_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl); - - virtual int install_ipv6_prefix_flt_rule(uint32_t* prefix); - - virtual void delete_ipv6_prefix_flt_rule(); - - int install_ipv6_icmp_flt_rule(); - - void post_del_self_evt(); - - /* handle tethering stats */ - int handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *data); - - /* handle tethering client */ - int handle_tethering_client(bool reset, ipacm_client_enum ipa_client); - - /* store ipv4 UL filter rule handlers from Q6*/ - uint32_t wan_ul_fl_rule_hdl_v4[MAX_WAN_UL_FILTER_RULES]; - - /* store ipv6 UL filter rule handlers from Q6*/ - uint32_t wan_ul_fl_rule_hdl_v6[MAX_WAN_UL_FILTER_RULES]; - - uint32_t ipv4_icmp_flt_rule_hdl[NUM_IPV4_ICMP_FLT_RULE]; - - uint32_t ipv6_prefix_flt_rule_hdl[NUM_IPV6_PREFIX_FLT_RULE]; - uint32_t ipv6_icmp_flt_rule_hdl[NUM_IPV6_ICMP_FLT_RULE]; - - int num_wan_ul_fl_rule_v4; - int num_wan_ul_fl_rule_v6; - - bool is_active; - bool modem_ul_v4_set; - bool modem_ul_v6_set; - - uint32_t if_ipv4_subnet; - - uint32_t ipv6_prefix[2]; - -private: - - /* get hdr proc ctx type given source and destination l2 hdr type */ - ipa_hdr_proc_type eth_bridge_get_hdr_proc_type(ipa_hdr_l2_type t1, ipa_hdr_l2_type t2); - - /* get partial header (header template of hdr proc ctx) */ - int eth_bridge_get_hdr_template_hdl(uint32_t* hdr_hdl); - - - /* dynamically allocate lan iface's unicast routing rule structure */ - - bool is_mode_switch; /* indicate mode switch, need post internal up event */ - - int eth_client_len; - - ipa_eth_client *eth_client; - - int header_name_count; - - int num_eth_client; - - NatApp *Nat_App; - - int ipv6_set; - - uint32_t ODU_hdr_hdl_v4, ODU_hdr_hdl_v6; - - uint32_t *odu_route_rule_v4_hdl; - - uint32_t *odu_route_rule_v6_hdl; - - bool ipv4_header_set; - - bool ipv6_header_set; - - inline ipa_eth_client* get_client_memptr(ipa_eth_client *param, int cnt) - { - char *ret = ((char *)param) + (eth_client_len * cnt); - return (ipa_eth_client *)ret; - } - - inline int get_eth_client_index(uint8_t *mac_addr) - { - int cnt; - int num_eth_client_tmp = num_eth_client; - - IPACMDBG_H("Passed MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - for(cnt = 0; cnt < num_eth_client_tmp; cnt++) - { - IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(eth_client, cnt)->mac[0], - get_client_memptr(eth_client, cnt)->mac[1], - get_client_memptr(eth_client, cnt)->mac[2], - get_client_memptr(eth_client, cnt)->mac[3], - get_client_memptr(eth_client, cnt)->mac[4], - get_client_memptr(eth_client, cnt)->mac[5]); - - if(memcmp(get_client_memptr(eth_client, cnt)->mac, - mac_addr, - sizeof(get_client_memptr(eth_client, cnt)->mac)) == 0) - { - IPACMDBG_H("Matched client index: %d\n", cnt); - return cnt; - } - } - - return IPACM_INVALID_INDEX; - } - - inline int delete_eth_rtrules(int clt_indx, ipa_ip_type iptype) - { - uint32_t tx_index; - uint32_t rt_hdl; - int num_v6; - - if(iptype == IPA_IP_v4) - { - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(eth_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */ - { - IPACMDBG_H("Delete client index %d ipv4 RT-rules for tx:%d\n",clt_indx,tx_index); - rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4; - - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false) - { - return IPACM_FAILURE; - } - } - } /* end of for loop */ - - /* clean the ipv4 RT rules for eth-client:clt_indx */ - if(get_client_memptr(eth_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */ - { - get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false; - } - } - - if(iptype == IPA_IP_v6) - { - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */ - { - for(num_v6 =0;num_v6 < get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++) - { - IPACMDBG_H("Delete client index %d ipv6 RT-rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index); - rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - - rt_hdl = get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - } - } - } /* end of for loop */ - - /* clean the ipv6 RT rules for eth-client:clt_indx */ - if(get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */ - { - get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0; - } - } - - return IPACM_SUCCESS; - } - - /* handle eth client initial, construct full headers (tx property) */ - int handle_eth_hdr_init(uint8_t *mac_addr); - - /* handle eth client ip-address */ - int handle_eth_client_ipaddr(ipacm_event_data_all *data); - - /* handle eth client routing rule*/ - int handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype); - - /*handle eth client del mode*/ - int handle_eth_client_down_evt(uint8_t *mac_addr); - - /* handle odu client initial, construct full headers (tx property) */ - int handle_odu_hdr_init(uint8_t *mac_addr); - - /* handle odu default route rule configuration */ - int handle_odu_route_add(); - - /* handle odu default route rule deletion */ - int handle_odu_route_del(); - - /*handle lan iface down event*/ - int handle_down_evt(); - - /*handle reset usb-client rt-rules */ - int handle_lan_client_reset_rt(ipa_ip_type iptype); -}; - -#endif /* IPACM_LAN_H */ diff --git a/ipacm/inc/IPACM_LanToLan.h b/ipacm/inc/IPACM_LanToLan.h deleted file mode 100644 index a28631e..0000000 --- a/ipacm/inc/IPACM_LanToLan.h +++ /dev/null @@ -1,202 +0,0 @@ -/* -Copyright (c) 2014, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * IPACM_LanToLan.h - * - * Created on: Mar 4th, 2014 - * Author: Shihuan Liu - */ - -#ifndef IPACM_LANTOLAN_H -#define IPACM_LANTOLAN_H - -#include <stdint.h> -#include "linux/msm_ipa.h" -#include "IPACM_Iface.h" -#include "IPACM_Defs.h" -#include "IPACM_Lan.h" - -#ifdef FEATURE_IPA_ANDROID -#include <libxml/list.h> -#else/* defined(FEATURE_IPA_ANDROID) */ -#include <list> -#endif /* ndefined(FEATURE_IPA_ANDROID)*/ - -#define MAX_NUM_CACHED_CLIENT_ADD_EVENT 10 -#define MAX_NUM_IFACE 10 -#define MAX_NUM_CLIENT 16 - -struct rt_rule_info -{ - int num_hdl[IPA_IP_MAX]; /* one client may need more than one routing rules on the same routing table depending on tx_prop */ - uint32_t rule_hdl[IPA_IP_MAX][MAX_NUM_PROP]; -}; - -struct client_info -{ - uint8_t mac_addr[6]; - rt_rule_info inter_iface_rt_rule_hdl[IPA_HDR_L2_MAX]; /* routing rule handles of inter interface communication based on source l2 header type */ - rt_rule_info intra_iface_rt_rule_hdl; /* routing rule handles of inter interface communication */ -}; - -struct flt_rule_info -{ - client_info *p_client; - uint32_t flt_rule_hdl[IPA_IP_MAX]; -}; - -struct peer_iface_info -{ - class IPACM_LanToLan_Iface *peer; - char rt_tbl_name_for_rt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX]; - char rt_tbl_name_for_flt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX]; - list<flt_rule_info> flt_rule; -}; - -class IPACM_LanToLan_Iface -{ -public: - IPACM_LanToLan_Iface(IPACM_Lan *p_iface); - ~IPACM_LanToLan_Iface(); - - void add_client_rt_rule_for_new_iface(); - - void add_all_inter_interface_client_flt_rule(ipa_ip_type iptype); - - void add_all_intra_interface_client_flt_rule(ipa_ip_type iptype); - - void handle_down_event(); - - void handle_wlan_scc_mcc_switch(); - - void handle_intra_interface_info(); - - void handle_new_iface_up(char rt_tbl_name_for_flt[][IPA_RESOURCE_NAME_MAX], char rt_tbl_name_for_rt[][IPA_RESOURCE_NAME_MAX], - IPACM_LanToLan_Iface *peer_iface); - - void handle_client_add(uint8_t *mac); - - void handle_client_del(uint8_t *mac); - - void print_data_structure_info(); - - IPACM_Lan* get_iface_pointer(); - - bool get_m_is_ip_addr_assigned(ipa_ip_type iptype); - - void set_m_is_ip_addr_assigned(ipa_ip_type iptype, bool value); - - bool get_m_support_inter_iface_offload(); - - bool get_m_support_intra_iface_offload(); - - void increment_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type); - - void decrement_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type); - -private: - - IPACM_Lan *m_p_iface; - bool m_is_ip_addr_assigned[IPA_IP_MAX]; - bool m_support_inter_iface_offload; - bool m_support_intra_iface_offload; - - int ref_cnt_peer_l2_hdr_type[IPA_HDR_L2_MAX]; /* reference count of l2 header type of peer interfaces */ - uint32_t hdr_proc_ctx_for_inter_interface[IPA_HDR_L2_MAX]; - uint32_t hdr_proc_ctx_for_intra_interface; - - list<client_info> m_client_info; /* client list */ - list<peer_iface_info> m_peer_iface_info; /* peer information list */ - - /* The following members are for intra-interface communication*/ - peer_iface_info m_intra_interface_info; - - void add_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client); - - void add_client_flt_rule(peer_iface_info *peer, client_info *client, ipa_ip_type iptype); - - void del_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client); - - void del_client_flt_rule(peer_iface_info *peer, client_info *client); - - void add_client_rt_rule(peer_iface_info *peer, client_info *client); - - void del_client_rt_rule(peer_iface_info *peer, client_info *client); - - void clear_all_flt_rule_for_one_peer_iface(peer_iface_info *peer); - - void clear_all_rt_rule_for_one_peer_iface(peer_iface_info *peer); - - void add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type); - - void del_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type); - - void print_peer_info(peer_iface_info *peer_info); - -}; - -class IPACM_LanToLan : public IPACM_Listener -{ - -public: - - IPACM_LanToLan(); - -private: - - ~IPACM_LanToLan(); - - list<class IPACM_LanToLan_Iface> m_iface; - - list<ipacm_event_eth_bridge> m_cached_client_add_event; - - void handle_iface_up(ipacm_event_eth_bridge *data); - - void handle_iface_down(ipacm_event_eth_bridge *data); - - void handle_client_add(ipacm_event_eth_bridge *data); - - void handle_client_del(ipacm_event_eth_bridge *data); - - void handle_wlan_scc_mcc_switch(ipacm_event_eth_bridge *data); - - void handle_new_iface_up(IPACM_LanToLan_Iface *new_iface, IPACM_LanToLan_Iface *exist_iface); - - void event_callback(ipa_cm_event_id event, void* param); - - void handle_cached_client_add_event(IPACM_Lan *p_iface); - - void clear_cached_client_add_event(IPACM_Lan *p_iface); - - void print_data_structure_info(); - -}; - -#endif diff --git a/ipacm/inc/IPACM_Listener.h b/ipacm/inc/IPACM_Listener.h deleted file mode 100644 index 9d774fe..0000000 --- a/ipacm/inc/IPACM_Listener.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Listener.h - - @brief - This file implements the abstract class notifier. - - @Author - Skylar Chang - -*/ -#ifndef IPACM_LISTENER_H -#define IPACM_LISTENER_H - -#include "IPACM_Defs.h" -#include "IPACM_CmdQueue.h" - -/* abstract class notifier */ -class IPACM_Listener -{ -public: - virtual void event_callback(ipa_cm_event_id event, void *data) = 0; - virtual ~IPACM_Listener(void) {}; -}; - -#endif /* IPACM_LISTENER_H */ diff --git a/ipacm/inc/IPACM_Log.h b/ipacm/inc/IPACM_Log.h deleted file mode 100644 index dab0280..0000000 --- a/ipacm/inc/IPACM_Log.h +++ /dev/null @@ -1,102 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_log.h - - @brief - This file implements the IPAM log functionality. - - @Author - Skylar Chang - -*/ - -#ifndef IPACM_LOG_H -#define IPACM_LOG_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include <stdio.h> -#include <string.h> -#include <syslog.h> - -#define MAX_BUF_LEN 256 - -#ifdef FEATURE_IPA_ANDROID -#define IPACMLOG_FILE "/dev/socket/ipacm_log_file" -#else/* defined(FEATURE_IPA_ANDROID) */ -#define IPACMLOG_FILE "/etc/ipacm_log_file" -#endif /* defined(NOT FEATURE_IPA_ANDROID)*/ - -typedef struct ipacm_log_buffer_s { - char user_data[MAX_BUF_LEN]; -} ipacm_log_buffer_t; - -void ipacm_log_send( void * user_data); - -static char buffer_send[MAX_BUF_LEN]; -static char dmesg_cmd[MAX_BUF_LEN]; - -#define IPACMDBG_DMESG(fmt, ...) memset(buffer_send, 0, MAX_BUF_LEN);\ - snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s: " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\ - ipacm_log_send (buffer_send);\ - printf("%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \ - memset(dmesg_cmd, 0, MAX_BUF_LEN);\ - snprintf(dmesg_cmd, MAX_BUF_LEN, "echo %s > /dev/kmsg", buffer_send);\ - system(dmesg_cmd); -#ifdef DEBUG -#define PERROR(fmt) memset(buffer_send, 0, MAX_BUF_LEN);\ - snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\ - ipacm_log_send (buffer_send); \ - perror(fmt); -#define IPACMERR(fmt, ...) memset(buffer_send, 0, MAX_BUF_LEN);\ - snprintf(buffer_send,MAX_BUF_LEN,"ERROR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\ - ipacm_log_send (buffer_send);\ - printf("ERROR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); -#define IPACMDBG_H(fmt, ...) memset(buffer_send, 0, MAX_BUF_LEN);\ - snprintf(buffer_send,MAX_BUF_LEN,"%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\ - ipacm_log_send (buffer_send);\ - printf("%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); -#else -#define PERROR(fmt) perror(fmt) -#define IPACMERR(fmt, ...) printf("ERR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); -#define IPACMDBG_H(fmt, ...) printf("%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); -#endif -#define IPACMDBG(fmt, ...) printf("%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); -#define IPACMLOG(fmt, ...) printf(fmt, ##__VA_ARGS__); - -#ifdef __cplusplus -} -#endif - -#endif /* IPACM_LOG_H */ diff --git a/ipacm/inc/IPACM_Neighbor.h b/ipacm/inc/IPACM_Neighbor.h deleted file mode 100644 index 14e86e5..0000000 --- a/ipacm/inc/IPACM_Neighbor.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Neighbor.h - - @brief - This file implements the functionality of handling IPACM Neighbor events. - - @Author - Skylar Chang - -*/ -#ifndef IPACM_NEIGHBOR_H -#define IPACM_NEIGHBOR_H - -#include <stdio.h> -#include <IPACM_CmdQueue.h> -#include <linux/msm_ipa.h> -#include "IPACM_Routing.h" -#include "IPACM_Filtering.h" -#include "IPACM_Listener.h" -#include "IPACM_Iface.h" - -#define IPA_MAX_NUM_NEIGHBOR_CLIENTS 100 - -struct ipa_neighbor_client -{ - uint8_t mac_addr[6]; - int iface_index; - uint32_t v4_addr; - int ipa_if_num; -}; - -class IPACM_Neighbor : public IPACM_Listener -{ - -public: - - IPACM_Neighbor(); - - void event_callback(ipa_cm_event_id event, - void *data); - -private: - - int num_neighbor_client; - - int circular_index; - - ipa_neighbor_client neighbor_client[IPA_MAX_NUM_NEIGHBOR_CLIENTS]; - -}; - -#endif /* IPACM_NEIGHBOR_H */ diff --git a/ipacm/inc/IPACM_Netlink.h b/ipacm/inc/IPACM_Netlink.h deleted file mode 100644 index b0bdeb8..0000000 --- a/ipacm/inc/IPACM_Netlink.h +++ /dev/null @@ -1,223 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPA_Netlink.h - - @brief - IPACM Netlink Messaging Implementation File - - @Author - Skylar Chang - -*/ -#ifndef IPACM_NETLINK_H -#define IPACM_NETLINK_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <pthread.h> -#include <sys/select.h> -#include <sys/socket.h> -#include <linux/if.h> -#include <linux/if_addr.h> -#include <linux/rtnetlink.h> -#include <linux/netlink.h> -#include <netinet/in.h> -#include "IPACM_Defs.h" - -#define MAX_NUM_OF_FD 10 -#define IPA_NL_MSG_MAX_LEN (2048) - -/*--------------------------------------------------------------------------- - Type representing enumeration of NetLink event indication messages ----------------------------------------------------------------------------*/ - -/*--------------------------------------------------------------------------- - Types representing parsed NetLink message ----------------------------------------------------------------------------*/ -#define IPA_NLA_PARAM_NONE (0x0000) -#define IPA_NLA_PARAM_PREFIXADDR (0x0001) -#define IPA_NLA_PARAM_LOCALADDR (0x0002) -#define IPA_NLA_PARAM_LABELNAME (0x0004) -#define IPA_NLA_PARAM_BCASTADDR (0x0008) -#define IPA_NLA_PARAM_ACASTADDR (0x0010) -#define IPA_NLA_PARAM_MCASTADDR (0x0020) -#define IPA_NLA_PARAM_CACHEINFO (0x0080) -#define IPA_NLA_PARAM_PROTOINFO (0x0100) -#define IPA_NLA_PARAM_FLAGS (0x0200) - -#define IPA_RTA_PARAM_NONE (0x0000) -#define IPA_RTA_PARAM_DST (0x0001) -#define IPA_RTA_PARAM_SRC (0x0002) -#define IPA_RTA_PARAM_GATEWAY (0x0004) -#define IPA_RTA_PARAM_IIF (0x0008) -#define IPA_RTA_PARAM_OIF (0x0010) -#define IPA_RTA_PARAM_CACHEINFO (0x0020) -#define IPA_RTA_PARAM_PRIORITY (0x0080) -#define IPA_RTA_PARAM_METRICS (0x0100) - - -/*--------------------------------------------------------------------------- - Type representing function callback registered with a socket listener - thread for reading from a socket on receipt of an incoming message ----------------------------------------------------------------------------*/ -typedef int (*ipa_sock_thrd_fd_read_f)(int fd); - -typedef enum -{ - IPA_INIT = 0, - IPA_LINK_UP_WAIT, - IPA_LINK_UP, - IPA_LINK_DOWN_WAIT, - IPA_LINK_DOWN -} ipa_nl_state_e; - -typedef struct -{ - int sk_fd; - ipa_sock_thrd_fd_read_f read_func; -} ipa_nl_sk_fd_map_info_t; - -typedef struct -{ - ipa_nl_sk_fd_map_info_t sk_fds[MAX_NUM_OF_FD]; - fd_set fdset; - int num_fd; - int max_fd; -} ipa_nl_sk_fd_set_info_t; - -typedef struct -{ - int sk_fd; /* socket descriptor */ - struct sockaddr_nl sk_addr_loc; /* local address of socket */ -} ipa_nl_sk_info_t; - -typedef struct ipa_nl_addr_s { - struct sockaddr_storage ip_addr; - unsigned int mask; -} ipa_nl_addr_t; - -typedef struct ipa_nl_proto_info_s { - unsigned int param_mask; - unsigned int flags; - struct ifla_cacheinfo cache_info; -} ipa_nl_proto_info_t; - -typedef struct -{ - struct ifinfomsg metainfo; /* from header */ -} ipa_nl_link_info_t; - - - -typedef struct ipa_nl_addr_info_s { - struct ifaddrmsg metainfo; /* from header */ - struct /* attributes */ - { - unsigned int param_mask; - unsigned char label_name[IF_NAME_LEN]; - struct sockaddr_storage prefix_addr; - struct sockaddr_storage local_addr; - struct sockaddr_storage bcast_addr; - struct sockaddr_storage acast_addr; - struct sockaddr_storage mcast_addr; - } attr_info; -} ipa_nl_addr_info_t; - - -typedef struct ipa_nl_neigh_info_s { - struct ndmsg metainfo; /* from header */ - struct /* attributes */ - { - unsigned int param_mask; - struct sockaddr_storage local_addr; - struct sockaddr lladdr_hwaddr; - } attr_info; -} ipa_nl_neigh_info_t; - - - -typedef struct ipa_nl_route_info_s { - struct rtmsg metainfo; /* from header */ - struct /* attributes */ - { - unsigned int param_mask; - struct sockaddr_storage dst_addr; - struct sockaddr_storage src_addr; - struct sockaddr_storage gateway_addr; - struct sockaddr_storage mark_addr; - struct rta_cacheinfo cache_info; - __u32 iif_index; /* Link index */ - __u32 oif_index; /* Link index */ - __u32 priority; - __u32 metrics; - ipa_nl_proto_info_t proto_info; - } attr_info; -} ipa_nl_route_info_t; - -#define IPA_FLOW_TYPE_INVALID (-1) - -typedef struct -{ - unsigned int type; - bool link_event; - /* Optional parameters */ - ipa_nl_link_info_t nl_link_info; - ipa_nl_addr_info_t nl_addr_info; - ipa_nl_neigh_info_t nl_neigh_info; - ipa_nl_route_info_t nl_route_info; -} ipa_nl_msg_t; - -/* Initialization routine for listener on NetLink sockets interface */ -int ipa_nl_listener_init -( - unsigned int nl_type, - unsigned int nl_groups, - ipa_nl_sk_fd_set_info_t *sk_fdset, - ipa_sock_thrd_fd_read_f read_f - ); - -/* Virtual function registered to receive incoming messages over the NETLINK routing socket*/ -int ipa_nl_recv_msg(int fd); - -/* map mask value for ipv6 */ -int mask_v6(int index, uint32_t *mask); - -#ifdef __cplusplus -} -#endif - -#endif /* IPACM_NETLINK_H */ diff --git a/ipacm/inc/IPACM_Routing.h b/ipacm/inc/IPACM_Routing.h deleted file mode 100644 index b5ffabc..0000000 --- a/ipacm/inc/IPACM_Routing.h +++ /dev/null @@ -1,78 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Routing.cpp - - @brief - This file implements the IPACM routing functionality. - - @Author - Skylar Chang - -*/ - - -#ifndef IPACM_ROUTING_H -#define IPACM_ROUTING_H - -#include <stdint.h> -#include <linux/msm_ipa.h> -#include <IPACM_Defs.h> - -using namespace std; - -class IPACM_Routing -{ -public: - IPACM_Routing(); - ~IPACM_Routing(); - - bool AddRoutingRule(struct ipa_ioc_add_rt_rule *ruleTable); - bool DeleteRoutingRule(struct ipa_ioc_del_rt_rule *ruleTable); - - bool Commit(enum ipa_ip_type ip); - bool Reset(enum ipa_ip_type ip); - - bool GetRoutingTable(struct ipa_ioc_get_rt_tbl *routingTable); - - bool DeviceNodeIsOpened(); - bool DeleteRoutingHdl(uint32_t rt_rule_hdl, ipa_ip_type ip); - - bool ModifyRoutingRule(struct ipa_ioc_mdfy_rt_rule *); - -private: - static const char *DEVICE_NAME; - int m_fd; /* File descriptor of the IPA device node /dev/ipa */ - - bool PutRoutingTable(uint32_t routingTableHandle); -}; - -#endif //IPACM_ROUTING_H - diff --git a/ipacm/inc/IPACM_Wan.h b/ipacm/inc/IPACM_Wan.h deleted file mode 100644 index fe6d35e..0000000 --- a/ipacm/inc/IPACM_Wan.h +++ /dev/null @@ -1,499 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Wan.cpp - - @brief - This file implements the WAN iface functionality. - - @Author - Skylar Chang - -*/ -#ifndef IPACM_WAN_H -#define IPACM_WAN_H - -#include <stdio.h> -#include <IPACM_CmdQueue.h> -#include <linux/msm_ipa.h> -#include "IPACM_Routing.h" -#include "IPACM_Filtering.h" -#include <IPACM_Iface.h> -#include <IPACM_Defs.h> -#include <IPACM_Xml.h> - -#define IPA_NUM_DEFAULT_WAN_FILTER_RULES 3 /*1 for v4, 2 for v6*/ -#define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4 2 - -#ifdef FEATURE_IPA_ANDROID -#define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6 6 -#else -#define IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6 3 -#endif - -#define NETWORK_STATS "%s %lu %lu %lu %lu" -#define IPA_NETWORK_STATS_FILE_NAME "/data/misc/ipa/network_stats" - -typedef struct _wan_client_rt_hdl -{ - uint32_t wan_rt_rule_hdl_v4; - uint32_t wan_rt_rule_hdl_v6[IPV6_NUM_ADDR]; - uint32_t wan_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR]; -}wan_client_rt_hdl; - -typedef struct _ipa_wan_client -{ - ipacm_event_data_wlan_ex* p_hdr_info; - uint8_t mac[IPA_MAC_ADDR_SIZE]; - uint32_t v4_addr; - uint32_t v6_addr[IPV6_NUM_ADDR][4]; - uint32_t hdr_hdl_v4; - uint32_t hdr_hdl_v6; - bool route_rule_set_v4; - int route_rule_set_v6; - bool ipv4_set; - int ipv6_set; - bool ipv4_header_set; - bool ipv6_header_set; - bool power_save_set; - wan_client_rt_hdl wan_rt_hdl[0]; /* depends on number of tx properties */ -}ipa_wan_client; - -/* wan iface */ -class IPACM_Wan : public IPACM_Iface -{ - -public: - - static bool wan_up; - static bool wan_up_v6; - static uint8_t xlat_mux_id; - /* IPACM interface name */ - static char wan_up_dev_name[IF_NAME_LEN]; - static uint32_t curr_wan_ip; - IPACM_Wan(int, ipacm_wan_iface_type, uint8_t *); - virtual ~IPACM_Wan(); - - static bool isWanUP(int ipa_if_num_tether) - { -#ifdef FEATURE_IPA_ANDROID - int i; - for (i=0; i < ipa_if_num_tether_v4_total;i++) - { - if (ipa_if_num_tether_v4[i] == ipa_if_num_tether) - { - IPACMDBG_H("support ipv4 tether_iface(%s)\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name); - return wan_up; - break; - } - } - return false; -#else - return wan_up; -#endif - } - - static bool isWanUP_V6(int ipa_if_num_tether) - { -#ifdef FEATURE_IPA_ANDROID - int i; - for (i=0; i < ipa_if_num_tether_v6_total;i++) - { - if (ipa_if_num_tether_v6[i] == ipa_if_num_tether) - { - IPACMDBG_H("support ipv6 tether_iface(%s)\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name); - return wan_up_v6; - break; - } - } - return false; -#else - return wan_up_v6; -#endif - } - - static uint32_t getWANIP() - { - return curr_wan_ip; - } - - static bool getXlat_Mux_Id() - { - return xlat_mux_id; - } - - void event_callback(ipa_cm_event_id event, - void *data); - - static struct ipa_flt_rule_add flt_rule_v4[IPA_MAX_FLT_RULE]; - static struct ipa_flt_rule_add flt_rule_v6[IPA_MAX_FLT_RULE]; - - static int num_v4_flt_rule; - static int num_v6_flt_rule; - - ipacm_wan_iface_type m_is_sta_mode; - static bool backhaul_is_sta_mode; - static bool is_ext_prop_set; - static uint32_t backhaul_ipv6_prefix[2]; - - static bool embms_is_on; - static bool backhaul_is_wan_bridge; - - static bool isWan_Bridge_Mode() - { - return backhaul_is_wan_bridge; - } -#ifdef FEATURE_IPA_ANDROID - /* IPACM interface id */ - static int ipa_if_num_tether_v4_total; - static int ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES]; - static int ipa_if_num_tether_v6_total; - static int ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES]; -#endif - -private: - - bool is_ipv6_frag_firewall_flt_rule_installed; - uint32_t ipv6_frag_firewall_flt_rule_hdl; - uint32_t *wan_route_rule_v4_hdl; - uint32_t *wan_route_rule_v6_hdl; - uint32_t *wan_route_rule_v6_hdl_a5; - uint32_t hdr_hdl_sta_v4; - uint32_t hdr_hdl_sta_v6; - uint32_t firewall_hdl_v4[IPACM_MAX_FIREWALL_ENTRIES]; - uint32_t firewall_hdl_v6[IPACM_MAX_FIREWALL_ENTRIES]; - uint32_t dft_wan_fl_hdl[IPA_NUM_DEFAULT_WAN_FILTER_RULES]; - uint32_t ipv6_dest_flt_rule_hdl[MAX_DEFAULT_v6_ROUTE_RULES]; - int num_ipv6_dest_flt_rule; - uint32_t ODU_fl_hdl[IPA_NUM_DEFAULT_WAN_FILTER_RULES]; - int num_firewall_v4,num_firewall_v6; - uint32_t wan_v4_addr; - uint32_t wan_v4_addr_gw; - uint32_t wan_v6_addr_gw[4]; - bool wan_v4_addr_set; - bool wan_v4_addr_gw_set; - bool wan_v6_addr_gw_set; - bool active_v4; - bool active_v6; - bool header_set_v4; - bool header_set_v6; - bool header_partial_default_wan_v4; - bool header_partial_default_wan_v6; - uint8_t ext_router_mac_addr[IPA_MAC_ADDR_SIZE]; - uint8_t netdev_mac[IPA_MAC_ADDR_SIZE]; - - static int num_ipv4_modem_pdn; - - static int num_ipv6_modem_pdn; - - int modem_ipv4_pdn_index; - - int modem_ipv6_pdn_index; - - bool is_default_gateway; - - uint32_t ipv6_prefix[2]; - - /* IPACM firewall Configuration file*/ - IPACM_firewall_conf_t firewall_config; - - /* STA mode wan-client*/ - int wan_client_len; - ipa_wan_client *wan_client; - int header_name_count; - int num_wan_client; - uint8_t invalid_mac[IPA_MAC_ADDR_SIZE]; - bool is_xlat; - - /* update network stats for CNE */ - int ipa_network_stats_fd; - uint32_t hdr_hdl_dummy_v6; - uint32_t hdr_proc_hdl_dummy_v6; - - inline ipa_wan_client* get_client_memptr(ipa_wan_client *param, int cnt) - { - char *ret = ((char *)param) + (wan_client_len * cnt); - return (ipa_wan_client *)ret; - } - - inline int get_wan_client_index(uint8_t *mac_addr) - { - int cnt; - int num_wan_client_tmp = num_wan_client; - - IPACMDBG_H("Passed MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - for(cnt = 0; cnt < num_wan_client_tmp; cnt++) - { - IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wan_client, cnt)->mac[0], - get_client_memptr(wan_client, cnt)->mac[1], - get_client_memptr(wan_client, cnt)->mac[2], - get_client_memptr(wan_client, cnt)->mac[3], - get_client_memptr(wan_client, cnt)->mac[4], - get_client_memptr(wan_client, cnt)->mac[5]); - - if(memcmp(get_client_memptr(wan_client, cnt)->mac, - mac_addr, - sizeof(get_client_memptr(wan_client, cnt)->mac)) == 0) - { - IPACMDBG_H("Matched client index: %d\n", cnt); - return cnt; - } - } - - return IPACM_INVALID_INDEX; - } - - inline int get_wan_client_index_ipv4(uint32_t ipv4_addr) - { - int cnt; - int num_wan_client_tmp = num_wan_client; - - IPACMDBG_H("Passed IPv4 %x\n", ipv4_addr); - - for(cnt = 0; cnt < num_wan_client_tmp; cnt++) - { - if (get_client_memptr(wan_client, cnt)->ipv4_set) - { - IPACMDBG_H("stored IPv4 %x\n", get_client_memptr(wan_client, cnt)->v4_addr); - - if(ipv4_addr == get_client_memptr(wan_client, cnt)->v4_addr) - { - IPACMDBG_H("Matched client index: %d\n", cnt); - IPACMDBG_H("The MAC is %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wan_client, cnt)->mac[0], - get_client_memptr(wan_client, cnt)->mac[1], - get_client_memptr(wan_client, cnt)->mac[2], - get_client_memptr(wan_client, cnt)->mac[3], - get_client_memptr(wan_client, cnt)->mac[4], - get_client_memptr(wan_client, cnt)->mac[5]); - IPACMDBG_H("header set ipv4(%d) ipv6(%d)\n", - get_client_memptr(wan_client, cnt)->ipv4_header_set, - get_client_memptr(wan_client, cnt)->ipv6_header_set); - return cnt; - } - } - } - return IPACM_INVALID_INDEX; - } - - inline int get_wan_client_index_ipv6(uint32_t* ipv6_addr) - { - int cnt, v6_num; - int num_wan_client_tmp = num_wan_client; - - IPACMDBG_H("Get ipv6 address 0x%08x.0x%08x.0x%08x.0x%08x\n", ipv6_addr[0], ipv6_addr[1], ipv6_addr[2], ipv6_addr[3]); - - for(cnt = 0; cnt < num_wan_client_tmp; cnt++) - { - if (get_client_memptr(wan_client, cnt)->ipv6_set) - { - for(v6_num=0;v6_num < get_client_memptr(wan_client, cnt)->ipv6_set;v6_num++) - { - - IPACMDBG_H("stored IPv6 0x%08x.0x%08x.0x%08x.0x%08x\n", get_client_memptr(wan_client, cnt)->v6_addr[v6_num][0], - get_client_memptr(wan_client, cnt)->v6_addr[v6_num][1], - get_client_memptr(wan_client, cnt)->v6_addr[v6_num][2], - get_client_memptr(wan_client, cnt)->v6_addr[v6_num][3]); - - if(ipv6_addr[0] == get_client_memptr(wan_client, cnt)->v6_addr[v6_num][0] && - ipv6_addr[1] == get_client_memptr(wan_client, cnt)->v6_addr[v6_num][1] && - ipv6_addr[2]== get_client_memptr(wan_client, cnt)->v6_addr[v6_num][2] && - ipv6_addr[3] == get_client_memptr(wan_client, cnt)->v6_addr[v6_num][3]) - { - IPACMDBG_H("Matched client index: %d\n", cnt); - IPACMDBG_H("The MAC is %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wan_client, cnt)->mac[0], - get_client_memptr(wan_client, cnt)->mac[1], - get_client_memptr(wan_client, cnt)->mac[2], - get_client_memptr(wan_client, cnt)->mac[3], - get_client_memptr(wan_client, cnt)->mac[4], - get_client_memptr(wan_client, cnt)->mac[5]); - IPACMDBG_H("header set ipv4(%d) ipv6(%d)\n", - get_client_memptr(wan_client, cnt)->ipv4_header_set, - get_client_memptr(wan_client, cnt)->ipv6_header_set); - return cnt; - } - } - } - } - return IPACM_INVALID_INDEX; - } - - inline int delete_wan_rtrules(int clt_indx, ipa_ip_type iptype) - { - uint32_t tx_index; - uint32_t rt_hdl; - int num_v6; - - if(iptype == IPA_IP_v4) - { - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(wan_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */ - { - IPACMDBG_H("Delete client index %d ipv4 Qos rules for tx:%d \n",clt_indx,tx_index); - rt_hdl = get_client_memptr(wan_client, clt_indx)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4; - - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false) - { - return IPACM_FAILURE; - } - } - } /* end of for loop */ - - /* clean the 4 Qos ipv4 RT rules for client:clt_indx */ - if(get_client_memptr(wan_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */ - { - get_client_memptr(wan_client, clt_indx)->route_rule_set_v4 = false; - } - } - - if(iptype == IPA_IP_v6) - { - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - - if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(wan_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */ - { - for(num_v6 =0;num_v6 < get_client_memptr(wan_client, clt_indx)->route_rule_set_v6;num_v6++) - { - IPACMDBG_H("Delete client index %d ipv6 Qos rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index); - rt_hdl = get_client_memptr(wan_client, clt_indx)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - - rt_hdl = get_client_memptr(wan_client, clt_indx)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - } - - } - } /* end of for loop */ - - /* clean the 4 Qos ipv6 RT rules for client:clt_indx */ - if(get_client_memptr(wan_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */ - { - get_client_memptr(wan_client, clt_indx)->route_rule_set_v6 = 0; - } - } - - return IPACM_SUCCESS; - } - - int handle_wan_hdr_init(uint8_t *mac_addr); - int handle_wan_client_ipaddr(ipacm_event_data_all *data); - int handle_wan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype); - - /* handle new_address event */ - int handle_addr_evt(ipacm_event_data_addr *data); - - /* wan default route/filter rule configuration */ - int handle_route_add_evt(ipa_ip_type iptype); - - /* construct complete STA ethernet header */ - int handle_sta_header_add_evt(); - - bool check_dft_firewall_rules_attr_mask(IPACM_firewall_conf_t *firewall_config); - -#ifdef FEATURE_IPA_ANDROID - /* wan posting supported tether_iface */ - int post_wan_up_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether); - - int post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether); -#endif - int config_dft_firewall_rules(ipa_ip_type iptype); - - /* configure the initial firewall filter rules */ - int config_dft_embms_rules(ipa_ioc_add_flt_rule *pFilteringTable_v4, ipa_ioc_add_flt_rule *pFilteringTable_v6); - - int handle_route_del_evt(ipa_ip_type iptype); - - int del_dft_firewall_rules(ipa_ip_type iptype); - - int handle_down_evt(); - - /*handle wan-iface down event */ - int handle_down_evt_ex(); - - /* wan default route/filter rule delete */ - int handle_route_del_evt_ex(ipa_ip_type iptype); - - /* configure the initial firewall filter rules */ - int config_dft_firewall_rules_ex(struct ipa_flt_rule_add* rules, int rule_offset, - ipa_ip_type iptype); - - /* init filtering rule in wan dl filtering table */ - int init_fl_rule_ex(ipa_ip_type iptype); - - /* add ICMP and ALG rules in wan dl filtering table */ - int add_icmp_alg_rules(struct ipa_flt_rule_add* rules, int rule_offset, ipa_ip_type iptype); - - /* query extended property */ - int query_ext_prop(); - - ipa_ioc_query_intf_ext_props *ext_prop; - - int config_wan_firewall_rule(ipa_ip_type iptype); - - int del_wan_firewall_rule(ipa_ip_type iptype); - - int add_dft_filtering_rule(struct ipa_flt_rule_add* rules, int rule_offset, ipa_ip_type iptype); - - int install_wan_filtering_rule(bool is_sw_routing); - - void change_to_network_order(ipa_ip_type iptype, ipa_rule_attrib* attrib); - - bool is_global_ipv6_addr(uint32_t* ipv6_addr); - - void handle_wlan_SCC_MCC_switch(bool, ipa_ip_type); - - void handle_wan_client_SCC_MCC_switch(bool, ipa_ip_type); - - int handle_network_stats_evt(); - - int m_fd_ipa; - - int handle_network_stats_update(ipa_get_apn_data_stats_resp_msg_v01 *data); - - /* construct dummy ethernet header */ - int add_dummy_rx_hdr(); -}; - -#endif /* IPACM_WAN_H */ diff --git a/ipacm/inc/IPACM_Wlan.h b/ipacm/inc/IPACM_Wlan.h deleted file mode 100644 index eb911ac..0000000 --- a/ipacm/inc/IPACM_Wlan.h +++ /dev/null @@ -1,240 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Wlan.h - - @brief - This file implements the WLAN iface functionality. - - @Author - Skylar Chang - -*/ -#ifndef IPACM_WLAN_H -#define IPACM_WLAN_H - -#include <stdio.h> -#include <IPACM_CmdQueue.h> -#include <linux/msm_ipa.h> -#include "IPACM_Routing.h" -#include "IPACM_Filtering.h" -#include "IPACM_Lan.h" -#include "IPACM_Iface.h" -#include "IPACM_Conntrack_NATApp.h" - -typedef struct _wlan_client_rt_hdl -{ - uint32_t wifi_rt_rule_hdl_v4; - uint32_t wifi_rt_rule_hdl_v6[IPV6_NUM_ADDR]; - uint32_t wifi_rt_rule_hdl_v6_wan[IPV6_NUM_ADDR]; -}wlan_client_rt_hdl; - -typedef struct _ipa_wlan_client -{ - ipacm_event_data_wlan_ex* p_hdr_info; - uint8_t mac[IPA_MAC_ADDR_SIZE]; - uint32_t v4_addr; - uint32_t v6_addr[IPV6_NUM_ADDR][4]; - uint32_t hdr_hdl_v4; - uint32_t hdr_hdl_v6; - bool route_rule_set_v4; - int route_rule_set_v6; - bool ipv4_set; - int ipv6_set; - bool ipv4_header_set; - bool ipv6_header_set; - bool power_save_set; - wlan_client_rt_hdl wifi_rt_hdl[0]; /* depends on number of tx properties */ -}ipa_wlan_client; - -/* wlan iface */ -class IPACM_Wlan : public IPACM_Lan -{ - -public: - - IPACM_Wlan(int iface_index); - virtual ~IPACM_Wlan(void); - - static int total_num_wifi_clients; - - void event_callback(ipa_cm_event_id event, void *data); - - bool is_guest_ap(); - -private: - - bool m_is_guest_ap; - - /* handle wlan access mode switch in ethernet bridging*/ - void eth_bridge_handle_wlan_mode_switch(); - - - int wlan_client_len; - ipa_wlan_client *wlan_client; - - int header_name_count; - int num_wifi_client; - - int wlan_ap_index; - - static int num_wlan_ap_iface; - - NatApp *Nat_App; - - inline ipa_wlan_client* get_client_memptr(ipa_wlan_client *param, int cnt) - { - char *ret = ((char *)param) + (wlan_client_len * cnt); - return (ipa_wlan_client *)ret; - } - - inline int get_wlan_client_index(uint8_t *mac_addr) - { - int cnt; - int num_wifi_client_tmp = num_wifi_client; - - IPACMDBG_H("Passed MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - for(cnt = 0; cnt < num_wifi_client_tmp; cnt++) - { - IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wlan_client, cnt)->mac[0], - get_client_memptr(wlan_client, cnt)->mac[1], - get_client_memptr(wlan_client, cnt)->mac[2], - get_client_memptr(wlan_client, cnt)->mac[3], - get_client_memptr(wlan_client, cnt)->mac[4], - get_client_memptr(wlan_client, cnt)->mac[5]); - - if(memcmp(get_client_memptr(wlan_client, cnt)->mac, - mac_addr, - sizeof(get_client_memptr(wlan_client, cnt)->mac)) == 0) - { - IPACMDBG_H("Matched client index: %d\n", cnt); - return cnt; - } - } - - return IPACM_INVALID_INDEX; - } - - inline int delete_default_qos_rtrules(int clt_indx, ipa_ip_type iptype) - { - uint32_t tx_index; - uint32_t rt_hdl; - int num_v6; - - if(iptype == IPA_IP_v4) - { - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if((tx_prop->tx[tx_index].ip == IPA_IP_v4) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true)) /* for ipv4 */ - { - IPACMDBG_H("Delete client index %d ipv4 Qos rules for tx:%d \n",clt_indx,tx_index); - rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4; - - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v4) == false) - { - return IPACM_FAILURE; - } - } - } /* end of for loop */ - - /* clean the 4 Qos ipv4 RT rules for client:clt_indx */ - if(get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4==true) /* for ipv4 */ - { - get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = false; - } - } - - if(iptype == IPA_IP_v6) - { - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - - if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 != 0)) /* for ipv6 */ - { - for(num_v6 =0;num_v6 < get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6;num_v6++) - { - IPACMDBG_H("Delete client index %d ipv6 Qos rules for %d-st ipv6 for tx:%d\n", clt_indx,num_v6,tx_index); - rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - - rt_hdl = get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - } - - } - } /* end of for loop */ - - /* clean the 4 Qos ipv6 RT rules for client:clt_indx */ - if(get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 != 0) /* for ipv6 */ - { - get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = 0; - } - } - - return IPACM_SUCCESS; - } - - /* for handle wifi client initial,copy all partial headers (tx property) */ - int handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data); - - /*handle wifi client */ - int handle_wlan_client_ipaddr(ipacm_event_data_all *data); - - /*handle wifi client routing rule*/ - int handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype); - - /*handle wifi client power-save mode*/ - int handle_wlan_client_pwrsave(uint8_t *mac_addr); - - /*handle wifi client del mode*/ - int handle_wlan_client_down_evt(uint8_t *mac_addr); - - /*handle wlan iface down event*/ - int handle_down_evt(); - - /*handle reset wifi-client rt-rules */ - int handle_wlan_client_reset_rt(ipa_ip_type iptype); - - void handle_SCC_MCC_switch(ipa_ip_type); - -}; - - -#endif /* IPACM_WLAN_H */ diff --git a/ipacm/inc/IPACM_Xml.h b/ipacm/inc/IPACM_Xml.h deleted file mode 100644 index 64c00ed..0000000 --- a/ipacm/inc/IPACM_Xml.h +++ /dev/null @@ -1,303 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Xml.h - - @brief - This file implements the XML specific parsing functionality. - - @Author - Skylar Chang/Shihuan Liu - -*/ -#ifndef IPACM_XML_H -#define IPACM_XML_H - -#include <linux/msm_ipa.h> -#include "IPACM_Defs.h" -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <arpa/inet.h> -#include <stdint.h> -#include <libxml/parser.h> -#include <libxml/tree.h> -#ifdef __cplusplus -extern "C" { -#endif - - -#define IPACM_ASSERT(a) \ -if (!(a)) { \ - fprintf(stderr, "%s, %d: assertion (a) failed!", \ - __FILE__, \ - __LINE__); \ - abort(); \ -} - -/* Max allowed size of the XML file (2 MB) */ -#define IPACM_XML_MAX_FILESIZE (2 << 20) -#define IPACM_MAX_FIREWALL_ENTRIES 50 -#define IPACM_IPV6_ADDR_LEN 16 - -/* Defines for clipping space or space & quotes (single, double) */ -#define IPACM_XML_CLIP_SPACE " " -#define IPACM_XML_CLIP_SPACE_QUOTES " '\"" - -#define MAX_XML_STR_LEN 120 - -/* IPA Config Entries */ -#define system_TAG "system" -#define ODU_TAG "ODUCFG" -#define ODUMODE_TAG "OduMode" -#define ODUEMBMS_OFFLOAD_TAG "eMBMS_offload" -#define ODU_ROUTER_TAG "router" -#define ODU_BRIDGE_TAG "bridge" -#define IPACMCFG_TAG "IPACM" -#define IPACMIFACECFG_TAG "IPACMIface" -#define IFACE_TAG "Iface" -#define NAME_TAG "Name" -#define CATEGORY_TAG "Category" -#define MODE_TAG "Mode" -#define IPACMPRIVATESUBNETCFG_TAG "IPACMPrivateSubnet" -#define SUBNET_TAG "Subnet" -#define SUBNETADDRESS_TAG "SubnetAddress" -#define SUBNETMASK_TAG "SubnetMask" -#define WANIF_TAG "WAN" -#define LANIF_TAG "LAN" -#define WLANIF_TAG "WLAN" -#define WLAN_FULL_MODE_TAG "full" -#define WLAN_INTERNET_MODE_TAG "internet" -#define WLAN_MODE_TAG "WlanMode" -#define VIRTUALIF_TAG "VIRTUAL" -#define UNKNOWNIF_TAG "UNKNOWN" -#define ODUIF_TAG "ODU" -#define EMBMSIF_TAG "EMBMS" -#define ETHIF_TAG "ETH" -#define IFACE_ROUTER_MODE_TAG "ROUTER" -#define IFACE_BRIDGE_MODE_TAG "BRIDGE" -#define IPACMALG_TAG "IPACMALG" -#define ALG_TAG "ALG" -#define Protocol_TAG "Protocol" -#define Port_TAG "Port" -#define TCP_PROTOCOL_TAG "TCP" -#define UDP_PROTOCOL_TAG "UDP" - -/* FIREWALL Config Entries */ -#define Firewall_TAG "Firewall" -#define MobileAPFirewallCfg_TAG "MobileAPFirewallCfg" -#define FirewallEnabled_TAG "FirewallEnabled" -#define FirewallPktsAllowed_TAG "FirewallPktsAllowed" - -#define IPFamily_TAG "IPFamily" -#define IPV4SourceAddress_TAG "IPV4SourceAddress" -#define IPV4SourceIPAddress_TAG "IPV4SourceIPAddress" -#define IPV4SourceSubnetMask_TAG "IPV4SourceSubnetMask" - -#define IPV4DestinationAddress_TAG "IPV4DestinationAddress" -#define IPV4DestinationIPAddress_TAG "IPV4DestinationIPAddress" -#define IPV4DestinationSubnetMask_TAG "IPV4DestinationSubnetMask" - -#define IPV4TypeOfService_TAG "IPV4TypeOfService" -#define TOSValue_TAG "TOSValue" -#define TOSMask_TAG "TOSMask" - -#define IPV4NextHeaderProtocol_TAG "IPV4NextHeaderProtocol" - -#define IPV6SourceAddress_TAG "IPV6SourceAddress" -#define IPV6SourceIPAddress_TAG "IPV6SourceIPAddress" -#define IPV6SourcePrefix_TAG "IPV6SourcePrefix" - -#define IPV6DestinationAddress_TAG "IPV6DestinationAddress" -#define IPV6DestinationIPAddress_TAG "IPV6DestinationIPAddress" -#define IPV6DestinationPrefix_TAG "IPV6DestinationPrefix" - -#define IPV6TrafficClass_TAG "IPV6TrafficClass" -#define TrfClsValue_TAG "TrfClsValue" -#define TrfClsMask_TAG "TrfClsMask" - -#define IPV6NextHeaderProtocol_TAG "IPV6NextHeaderProtocol" - -#define TCPSource_TAG "TCPSource" -#define TCPSourcePort_TAG "TCPSourcePort" -#define TCPSourceRange_TAG "TCPSourceRange" - -#define TCPDestination_TAG "TCPDestination" -#define TCPDestinationPort_TAG "TCPDestinationPort" -#define TCPDestinationRange_TAG "TCPDestinationRange" - -#define UDPSource_TAG "UDPSource" -#define UDPSourcePort_TAG "UDPSourcePort" -#define UDPSourceRange_TAG "UDPSourceRange" - -#define UDPDestination_TAG "UDPDestination" -#define UDPDestinationPort_TAG "UDPDestinationPort" -#define UDPDestinationRange_TAG "UDPDestinationRange" - -#define ICMPType_TAG "ICMPType" -#define ICMPCode_TAG "ICMPCode" - -#define ESP_TAG "ESP" -#define ESPSPI_TAG "ESPSPI" - -#define TCP_UDPSource_TAG "TCP_UDPSource" -#define TCP_UDPSourcePort_TAG "TCP_UDPSourcePort" -#define TCP_UDPSourceRange_TAG "TCP_UDPSourceRange" - -#define TCP_UDPDestination_TAG "TCP_UDPDestination" -#define TCP_UDPDestinationPort_TAG "TCP_UDPDestinationPort" -#define TCP_UDPDestinationRange_TAG "TCP_UDPDestinationRange" - -#define IPACMNat_TAG "IPACMNAT" -#define NAT_MaxEntries_TAG "MaxNatEntries" - -#define IP_PassthroughFlag_TAG "IPPassthroughFlag" -#define IP_PassthroughMode_TAG "IPPassthroughMode" - -/*--------------------------------------------------------------------------- - IP protocol numbers - use in dss_socket() to identify protocols. - Also contains the extension header types for IPv6. ----------------------------------------------------------------------------*/ -typedef enum -{ - IPACM_FIREWALL_IPV6_BASE_HDR = 4, /* IPv6 Base Header */ - IPACM_FIREWALL_IPPROTO_HOP_BY_HOP_OPT_HDR = 0, /* Hop-by-hop Option Header */ - IPACM_FIREWALL_IPPROTO_ICMP = 1, /* ICMP protocol */ - IPACM_FIREWALL_IPPROTO_IGMP = 2, /* IGMP protocol */ - IPACM_FIREWALL_IPPROTO_IP = IPACM_FIREWALL_IPV6_BASE_HDR, /* IPv4 */ - IPACM_FIREWALL_IPPROTO_TCP = 6, /* TCP Protocol */ - IPACM_FIREWALL_IPPROTO_UDP = 17, /* UDP Protocol */ - IPACM_FIREWALL_IPPROTO_IPV6 = 41, /* IPv6 */ - IPACM_FIREWALL_IPPROTO_ROUTING_HDR = 43, /* Routing Header */ - IPACM_FIREWALL_IPPROTO_FRAG_HDR = 44, /* Fragmentation Header */ - IPACM_FIREWALL_IPPROTO_GRE = 47, /* GRE Protocol */ - IPACM_FIREWALL_IPPROTO_ESP = 50, /* ESP Protocol */ - IPACM_FIREWALL_IPPROTO_AH = 51, /* Authentication Header */ - IPACM_FIREWALL_IPPROTO_ICMP6 = 58, /* ICMPv6 */ - IPACM_FIREWALL_NO_NEXT_HDR = 59, /* No Next Header for IPv6 */ - IPACM_FIREWALL_IPPROTO_DEST_OPT_HDR = 60, /* Destination Options Header */ - IPACM_FIREWALL_IPPROTO_MOBILITY_HDR = 135, /* Mobility Header */ - IPACM_FIREWALL_IPPROTO_TCP_UDP = 253 /* Unspecified protocol used for IPACM */ -} ipacm_firewall_ip_protocol_enum_type; - -/* define as mobileap firewall rule format*/ -typedef enum -{ - IP_V4 = 4, - IP_V6 = 6 -} firewall_ip_version_enum; - -/*--------------------------------------------------------------------------- - Extended FireWall Entry Configuration. ----------------------------------------------------------------------------*/ -typedef struct -{ - struct ipa_rule_attrib attrib; - firewall_ip_version_enum ip_vsn; -} IPACM_extd_firewall_entry_conf_t; - - -/*--------------------------------------------------------------------------- - Extended FireWall configuration. ----------------------------------------------------------------------------*/ -typedef union -{ - IPACM_extd_firewall_entry_conf_t extd_firewall_entry; -} IPACM_extd_firewall_conf_t; - - -typedef struct -{ - char firewall_config_file[IPA_MAX_FILE_LEN]; - uint8_t num_extd_firewall_entries; - IPACM_extd_firewall_entry_conf_t extd_firewall_entries[IPACM_MAX_FIREWALL_ENTRIES]; - bool rule_action_accept; - bool firewall_enable; -} IPACM_firewall_conf_t; - - - -typedef struct -{ - uint8_t num_iface_entries; - ipa_ifi_dev_name_t iface_entries[IPA_MAX_IFACE_ENTRIES]; -} ipacm_iface_conf_t; - -typedef struct -{ - uint8_t num_subnet_entries; - ipa_private_subnet private_subnet_entries[IPA_MAX_PRIVATE_SUBNET_ENTRIES]; -} ipacm_private_subnet_conf_t; - -typedef struct -{ - uint8_t protocol; - uint16_t port; -} ipacm_alg; - -typedef struct -{ - uint8_t num_alg_entries; - ipacm_alg alg_entries[IPA_MAX_ALG_ENTRIES]; -} ipacm_alg_conf_t; - - -typedef struct _IPACM_conf_t -{ - ipacm_iface_conf_t iface_config; - ipacm_private_subnet_conf_t private_subnet_config; - ipacm_alg_conf_t alg_config; - int nat_max_entries; - bool odu_enable; - bool router_mode_enable; - bool odu_embms_enable; - int num_wlan_guest_ap; - bool ip_passthrough_mode; -} IPACM_conf_t; - -/* This function read IPACM XML configuration*/ -int ipacm_read_cfg_xml -( - char *xml_file, /* Filename and path */ - IPACM_conf_t *config /* Mobile AP config data */ -); - -/* This function reads QCMAP Firewall XML and store in IPACM Firewall stucture */ -int IPACM_read_firewall_xml -( - char *xml_file, /* Filename and path */ - IPACM_firewall_conf_t *config /* Mobile AP config data */ -); - -#ifdef __cplusplus -} -#endif - -#endif //IPACM_XML diff --git a/ipacm/src/Android.mk b/ipacm/src/Android.mk deleted file mode 100644 index a59c7f4..0000000 --- a/ipacm/src/Android.mk +++ /dev/null @@ -1,102 +0,0 @@ -BOARD_PLATFORM_LIST := msm8916 -BOARD_PLATFORM_LIST += msm8909 -ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true) -ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM))) -ifneq (, $(filter aarch64 arm arm64, $(TARGET_ARCH))) - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_C_INCLUDES := $(LOCAL_PATH)/../src -LOCAL_C_INCLUDES += $(LOCAL_PATH)/../inc -LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ipanat/inc -ifeq ($(call is-platform-sdk-version-at-least,20),true) -LOCAL_C_INCLUDES += external/icu/icu4c/source/common -else -LOCAL_C_INCLUDES += external/icu4c/common -endif -LOCAL_C_INCLUDES += external/dhcpcd -LOCAL_C_INCLUDES += external/libxml2/include -LOCAL_C_INCLUDES += external/libnetfilter_conntrack/include -LOCAL_C_INCLUDES += external/libnfnetlink/include - -ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) -LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -endif - - -LOCAL_CFLAGS := -v -LOCAL_CFLAGS += -DFEATURE_IPA_ANDROID -ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) -LOCAL_CFLAGS += -DDEBUG -endif - -ifeq ($(TARGET_BOARD_PLATFORM),msmcobalt) -LOCAL_CFLAGS += -DFEATURE_IPA_V3 -endif - -filetoadd = bionic/libc/kernel/arch-arm/asm/posix_types.h -LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;) -filetoadd = bionic/libc/kernel/arch-arm/asm/byteorder.h -LOCAL_CFLAGS += $(shell if [ -a $(filetoadd) ] ; then echo -include $(filetoadd) ; fi ;) - -LOCAL_SRC_FILES := IPACM_Main.cpp \ - IPACM_EvtDispatcher.cpp \ - IPACM_Config.cpp \ - IPACM_CmdQueue.cpp \ - IPACM_Filtering.cpp \ - IPACM_Routing.cpp \ - IPACM_Header.cpp \ - IPACM_Lan.cpp \ - IPACM_Iface.cpp \ - IPACM_Wlan.cpp \ - IPACM_Wan.cpp \ - IPACM_IfaceManager.cpp \ - IPACM_Neighbor.cpp \ - IPACM_Netlink.cpp \ - IPACM_Xml.cpp \ - IPACM_Conntrack_NATApp.cpp\ - IPACM_ConntrackClient.cpp \ - IPACM_ConntrackListener.cpp \ - IPACM_Log.cpp - -LOCAL_MODULE := ipacm -LOCAL_CLANG := false -LOCAL_MODULE_TAGS := optional - -LOCAL_SHARED_LIBRARIES := libipanat -LOCAL_SHARED_LIBRARIES += libxml2 -LOCAL_SHARED_LIBRARIES += libnfnetlink -LOCAL_SHARED_LIBRARIES += libnetfilter_conntrack -LOCAL_SHARED_LIBRARIES += libdhcpcd -LOCAL_CLANG := true -include $(BUILD_EXECUTABLE) - -################################################################################ - -define ADD_TEST - -include $(CLEAR_VARS) -LOCAL_MODULE := $1 -LOCAL_SRC_FILES := $1 -LOCAL_MODULE_CLASS := ipacm -LOCAL_MODULE_TAGS := debug -LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) -include $(BUILD_PREBUILT) - -endef - -include $(CLEAR_VARS) -LOCAL_MODULE := IPACM_cfg.xml -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_PATH := $(TARGET_OUT_ETC) -LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(LOCAL_MODULE) -LOCAL_MODULE_OWNER := ipacm -include $(BUILD_PREBUILT) - -endif # $(TARGET_ARCH) -endif -endif diff --git a/ipacm/src/IPACM_CmdQueue.cpp b/ipacm/src/IPACM_CmdQueue.cpp deleted file mode 100644 index a17fb08..0000000 --- a/ipacm/src/IPACM_CmdQueue.cpp +++ /dev/null @@ -1,205 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_CmdQueue.cpp - - @brief - This file implements the IPAM Comment Queue functionality - - @Author - Sunil - -*/ -#include <string.h> -#include "IPACM_CmdQueue.h" -#include "IPACM_Log.h" -#include "IPACM_Iface.h" - -pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER; - -MessageQueue* MessageQueue::inst_internal = NULL; -MessageQueue* MessageQueue::inst_external = NULL; - -MessageQueue* MessageQueue::getInstanceInternal() -{ - if(inst_internal == NULL) - { - inst_internal = new MessageQueue(); - if(inst_internal == NULL) - { - IPACMERR("unable to create internal Message Queue instance\n"); - return NULL; - } - } - - return inst_internal; -} - -MessageQueue* MessageQueue::getInstanceExternal() -{ - if(inst_external == NULL) - { - inst_external = new MessageQueue(); - if(inst_external == NULL) - { - IPACMERR("unable to create external Message Queue instance\n"); - return NULL; - } - } - - return inst_external; -} - -void MessageQueue::enqueue(Message *item) -{ - if(!Head) - { - Tail = item; - Head = item; - } - else - { - if(Tail == NULL) - { - IPACMDBG("Tail is null\n"); - Head->setnext(item); - } - else - { - Tail->setnext(item); - } - Tail = item; - } -} - - -Message* MessageQueue::dequeue(void) -{ - if(Head == NULL) - { - return NULL; - } - else - { - Message *tmp = Head; - Head = Head->getnext(); - - return tmp; - } -} - - -void* MessageQueue::Process(void *param) -{ - MessageQueue *MsgQueueInternal = NULL; - MessageQueue *MsgQueueExternal = NULL; - Message *item = NULL; - IPACMDBG("MessageQueue::Process()\n"); - - MsgQueueInternal = MessageQueue::getInstanceInternal(); - if(MsgQueueInternal == NULL) - { - IPACMERR("unable to start internal cmd queue process\n"); - return NULL; - } - - MsgQueueExternal = MessageQueue::getInstanceExternal(); - if(MsgQueueExternal == NULL) - { - IPACMERR("unable to start external cmd queue process\n"); - return NULL; - } - - while(1) - { - if(pthread_mutex_lock(&mutex) != 0) - { - IPACMERR("unable to lock the mutex\n"); - return NULL; - } - - item = MsgQueueInternal->dequeue(); - if(item == NULL) - { - item = MsgQueueExternal->dequeue(); - if(item) - { - IPACMDBG("Get event %s from external queue.\n", - IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event)); - } - } - else - { - IPACMDBG("Get event %s from internal queue.\n", - IPACM_Iface::ipacmcfg->getEventName(item->evt.data.event)); - } - - if(item == NULL) - { - IPACMDBG("Waiting for Message\n"); - - if(pthread_cond_wait(&cond_var, &mutex) != 0) - { - IPACMERR("unable to lock the mutex\n"); - - if(pthread_mutex_unlock(&mutex) != 0) - { - IPACMERR("unable to unlock the mutex\n"); - return NULL; - } - - return NULL; - } - - if(pthread_mutex_unlock(&mutex) != 0) - { - IPACMERR("unable to unlock the mutex\n"); - return NULL; - } - - } - else - { - if(pthread_mutex_unlock(&mutex) != 0) - { - IPACMERR("unable to unlock the mutex\n"); - return NULL; - } - - IPACMDBG("Processing item %p event ID: %d\n",item,item->evt.data.event); - item->evt.callback_ptr(&item->evt.data); - delete item; - item = NULL; - } - - } /* Go forever until a termination indication is received */ - -} diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp deleted file mode 100644 index 4b02b57..0000000 --- a/ipacm/src/IPACM_Config.cpp +++ /dev/null @@ -1,816 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Config.cpp - - @brief - This file implements the IPACM Configuration from XML file - - @Author - Skylar Chang - -*/ -#include <IPACM_Config.h> -#include <IPACM_Log.h> -#include <IPACM_Iface.h> -#include <sys/ioctl.h> -#include <fcntl.h> - -IPACM_Config *IPACM_Config::pInstance = NULL; -const char *IPACM_Config::DEVICE_NAME = "/dev/ipa"; -const char *IPACM_Config::DEVICE_NAME_ODU = "/dev/odu_ipa_bridge"; - -#define __stringify(x...) #x - -const char *ipacm_event_name[] = { - __stringify(IPA_CFG_CHANGE_EVENT), /* NULL */ - __stringify(IPA_PRIVATE_SUBNET_CHANGE_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_FIREWALL_CHANGE_EVENT), /* NULL */ - __stringify(IPA_LINK_UP_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_LINK_DOWN_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_USB_LINK_UP_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_BRIDGE_LINK_UP_EVENT), /* ipacm_event_data_all */ - __stringify(IPA_WAN_EMBMS_LINK_UP_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_ADDR_ADD_EVENT), /* ipacm_event_data_addr */ - __stringify(IPA_ADDR_DEL_EVENT), /* no use */ - __stringify(IPA_ROUTE_ADD_EVENT), /* ipacm_event_data_addr */ - __stringify(IPA_ROUTE_DEL_EVENT), /* ipacm_event_data_addr */ - __stringify(IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_WLAN_AP_LINK_UP_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_WLAN_STA_LINK_UP_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_WLAN_LINK_DOWN_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_WLAN_CLIENT_ADD_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_WLAN_CLIENT_ADD_EVENT_EX), /* ipacm_event_data_wlan_ex */ - __stringify(IPA_WLAN_CLIENT_DEL_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_WLAN_CLIENT_POWER_SAVE_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_WLAN_CLIENT_RECOVER_EVENT), /* ipacm_event_data_mac */ - __stringify(IPA_NEW_NEIGH_EVENT), /* ipacm_event_data_all */ - __stringify(IPA_DEL_NEIGH_EVENT), /* ipacm_event_data_all */ - __stringify(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT), /* ipacm_event_data_all */ - __stringify(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT), /* ipacm_event_data_all */ - __stringify(IPA_SW_ROUTING_ENABLE), /* NULL */ - __stringify(IPA_SW_ROUTING_DISABLE), /* NULL */ - __stringify(IPA_PROCESS_CT_MESSAGE), /* ipacm_ct_evt_data */ - __stringify(IPA_PROCESS_CT_MESSAGE_V6), /* ipacm_ct_evt_data */ - __stringify(IPA_LAN_TO_LAN_NEW_CONNECTION), /* ipacm_event_connection */ - __stringify(IPA_LAN_TO_LAN_DEL_CONNECTION), /* ipacm_event_connection */ - __stringify(IPA_WLAN_SWITCH_TO_SCC), /* No Data */ - __stringify(IPA_WLAN_SWITCH_TO_MCC), /* No Data */ - __stringify(IPA_CRADLE_WAN_MODE_SWITCH), /* ipacm_event_cradle_wan_mode */ - __stringify(IPA_WAN_XLAT_CONNECT_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_TETHERING_STATS_UPDATE_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_NETWORK_STATS_UPDATE_EVENT), /* ipacm_event_data_fid */ - __stringify(IPA_EXTERNAL_EVENT_MAX), - __stringify(IPA_HANDLE_WAN_UP), /* ipacm_event_iface_up */ - __stringify(IPA_HANDLE_WAN_DOWN), /* ipacm_event_iface_up */ - __stringify(IPA_HANDLE_WAN_UP_V6), /* NULL */ - __stringify(IPA_HANDLE_WAN_DOWN_V6), /* NULL */ - __stringify(IPA_HANDLE_WAN_UP_TETHER), /* ipacm_event_iface_up_tehter */ - __stringify(IPA_HANDLE_WAN_DOWN_TETHER), /* ipacm_event_iface_up_tehter */ - __stringify(IPA_HANDLE_WAN_UP_V6_TETHER), /* ipacm_event_iface_up_tehter */ - __stringify(IPA_HANDLE_WAN_DOWN_V6_TETHER), /* ipacm_event_iface_up_tehter */ - __stringify(IPA_HANDLE_WLAN_UP), /* ipacm_event_iface_up */ - __stringify(IPA_HANDLE_LAN_UP), /* ipacm_event_iface_up */ - __stringify(IPA_ETH_BRIDGE_IFACE_UP), /* ipacm_event_eth_bridge*/ - __stringify(IPA_ETH_BRIDGE_IFACE_DOWN), /* ipacm_event_eth_bridge*/ - __stringify(IPA_ETH_BRIDGE_CLIENT_ADD), /* ipacm_event_eth_bridge*/ - __stringify(IPA_ETH_BRIDGE_CLIENT_DEL), /* ipacm_event_eth_bridge*/ - __stringify(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH), /* ipacm_event_eth_bridge*/ - __stringify(IPA_LAN_DELETE_SELF), /* ipacm_event_data_fid */ - __stringify(IPACM_EVENT_MAX), -}; - -IPACM_Config::IPACM_Config() -{ - iface_table = NULL; - alg_table = NULL; - pNatIfaces = NULL; - memset(&ipa_client_rm_map_tbl, 0, sizeof(ipa_client_rm_map_tbl)); - memset(&ipa_rm_tbl, 0, sizeof(ipa_rm_tbl)); - ipa_rm_a2_check=0; - ipacm_odu_enable = false; - ipacm_odu_router_mode = false; - ipa_num_wlan_guest_ap = 0; - - ipa_num_ipa_interfaces = 0; - ipa_num_private_subnet = 0; - ipa_num_alg_ports = 0; - ipa_nat_max_entries = 0; - ipa_nat_iface_entries = 0; - ipa_sw_rt_enable = false; - ipa_bridge_enable = false; - isMCC_Mode = false; - ipa_max_valid_rm_entry = 0; - - memset(&rt_tbl_default_v4, 0, sizeof(rt_tbl_default_v4)); - memset(&rt_tbl_lan_v4, 0, sizeof(rt_tbl_lan_v4)); - memset(&rt_tbl_wan_v4, 0, sizeof(rt_tbl_wan_v4)); - memset(&rt_tbl_v6, 0, sizeof(rt_tbl_v6)); - memset(&rt_tbl_wan_v6, 0, sizeof(rt_tbl_wan_v6)); - memset(&rt_tbl_wan_dl, 0, sizeof(rt_tbl_wan_dl)); - memset(&rt_tbl_odu_v4, 0, sizeof(rt_tbl_odu_v4)); - memset(&rt_tbl_odu_v6, 0, sizeof(rt_tbl_odu_v6)); - - memset(&ext_prop_v4, 0, sizeof(ext_prop_v4)); - memset(&ext_prop_v6, 0, sizeof(ext_prop_v6)); - - qmap_id = ~0; - - memset(flt_rule_count_v4, 0, (IPA_CLIENT_CONS - IPA_CLIENT_PROD)*sizeof(int)); - memset(flt_rule_count_v6, 0, (IPA_CLIENT_CONS - IPA_CLIENT_PROD)*sizeof(int)); - memset(bridge_mac, 0, IPA_MAC_ADDR_SIZE*sizeof(uint8_t)); - - IPACMDBG_H(" create IPACM_Config constructor\n"); - return; -} - -int IPACM_Config::Init(void) -{ - /* Read IPACM Config file */ - char IPACM_config_file[IPA_MAX_FILE_LEN]; - IPACM_conf_t *cfg; - cfg = (IPACM_conf_t *)malloc(sizeof(IPACM_conf_t)); - if(cfg == NULL) - { - IPACMERR("Unable to allocate cfg memory.\n"); - return IPACM_FAILURE; - } - uint32_t subnet_addr; - uint32_t subnet_mask; - int i, ret = IPACM_SUCCESS; - struct in_addr in_addr_print; - - m_fd = open(DEVICE_NAME, O_RDWR); - if (0 > m_fd) - { - IPACMERR("Failed opening %s.\n", DEVICE_NAME); - } - strncpy(IPACM_config_file, "/etc/IPACM_cfg.xml", sizeof(IPACM_config_file)); - - IPACMDBG_H("\n IPACM XML file is %s \n", IPACM_config_file); - if (IPACM_SUCCESS == ipacm_read_cfg_xml(IPACM_config_file, cfg)) - { - IPACMDBG_H("\n IPACM XML read OK \n"); - } - else - { - IPACMERR("\n IPACM XML read failed \n"); - ret = IPACM_FAILURE; - goto fail; - } - - /* Construct IPACM Iface table */ - ipa_num_ipa_interfaces = cfg->iface_config.num_iface_entries; - if (iface_table != NULL) - { - free(iface_table); - iface_table = NULL; - IPACMDBG_H("RESET IPACM_Config::iface_table\n"); - } - iface_table = (ipa_ifi_dev_name_t *)calloc(ipa_num_ipa_interfaces, - sizeof(ipa_ifi_dev_name_t)); - if(iface_table == NULL) - { - IPACMERR("Unable to allocate iface_table memory.\n"); - ret = IPACM_FAILURE; - goto fail; - } - - for (i = 0; i < cfg->iface_config.num_iface_entries; i++) - { - strncpy(iface_table[i].iface_name, cfg->iface_config.iface_entries[i].iface_name, sizeof(iface_table[i].iface_name)); - iface_table[i].if_cat = cfg->iface_config.iface_entries[i].if_cat; - iface_table[i].if_mode = cfg->iface_config.iface_entries[i].if_mode; - iface_table[i].wlan_mode = cfg->iface_config.iface_entries[i].wlan_mode; - IPACMDBG_H("IPACM_Config::iface_table[%d] = %s, cat=%d, mode=%d wlan-mode=%d \n", i, iface_table[i].iface_name, - iface_table[i].if_cat, iface_table[i].if_mode, iface_table[i].wlan_mode); - /* copy bridge interface name to ipacmcfg */ - if( iface_table[i].if_cat == VIRTUAL_IF) - { - strlcpy(ipa_virtual_iface_name, iface_table[i].iface_name, sizeof(ipa_virtual_iface_name)); - IPACMDBG_H("ipa_virtual_iface_name(%s) \n", ipa_virtual_iface_name); - } - } - - /* Construct IPACM Private_Subnet table */ - memset(&private_subnet_table, 0, sizeof(private_subnet_table)); - ipa_num_private_subnet = cfg->private_subnet_config.num_subnet_entries; - - for (i = 0; i < cfg->private_subnet_config.num_subnet_entries; i++) - { - memcpy(&private_subnet_table[i].subnet_addr, - &cfg->private_subnet_config.private_subnet_entries[i].subnet_addr, - sizeof(cfg->private_subnet_config.private_subnet_entries[i].subnet_addr)); - - memcpy(&private_subnet_table[i].subnet_mask, - &cfg->private_subnet_config.private_subnet_entries[i].subnet_mask, - sizeof(cfg->private_subnet_config.private_subnet_entries[i].subnet_mask)); - - subnet_addr = htonl(private_subnet_table[i].subnet_addr); - memcpy(&in_addr_print,&subnet_addr,sizeof(in_addr_print)); - IPACMDBG_H("%dst::private_subnet_table= %s \n ", i, - inet_ntoa(in_addr_print)); - - subnet_mask = htonl(private_subnet_table[i].subnet_mask); - memcpy(&in_addr_print,&subnet_mask,sizeof(in_addr_print)); - IPACMDBG_H("%dst::private_subnet_table= %s \n ", i, - inet_ntoa(in_addr_print)); - } - - /* Construct IPACM ALG table */ - ipa_num_alg_ports = cfg->alg_config.num_alg_entries; - if (alg_table != NULL) - { - free(alg_table); - alg_table = NULL; - IPACMDBG_H("RESET IPACM_Config::alg_table \n"); - } - alg_table = (ipacm_alg *)calloc(ipa_num_alg_ports, - sizeof(ipacm_alg)); - if(alg_table == NULL) - { - IPACMERR("Unable to allocate alg_table memory.\n"); - ret = IPACM_FAILURE; - free(iface_table); - goto fail;; - } - for (i = 0; i < cfg->alg_config.num_alg_entries; i++) - { - alg_table[i].protocol = cfg->alg_config.alg_entries[i].protocol; - alg_table[i].port = cfg->alg_config.alg_entries[i].port; - IPACMDBG_H("IPACM_Config::ipacm_alg[%d] = %d, port=%d\n", i, alg_table[i].protocol, alg_table[i].port); - } - - ipa_nat_max_entries = cfg->nat_max_entries; - IPACMDBG_H("Nat Maximum Entries %d\n", ipa_nat_max_entries); - - /* Find ODU is either router mode or bridge mode*/ - ipacm_odu_enable = cfg->odu_enable; - ipacm_odu_router_mode = cfg->router_mode_enable; - ipacm_odu_embms_enable = cfg->odu_embms_enable; - IPACMDBG_H("ipacm_odu_enable %d\n", ipacm_odu_enable); - IPACMDBG_H("ipacm_odu_mode %d\n", ipacm_odu_router_mode); - IPACMDBG_H("ipacm_odu_embms_enable %d\n", ipacm_odu_embms_enable); - - ipacm_ip_passthrough_mode = cfg->ip_passthrough_mode; - IPACMDBG_H("ipacm_ip_passthrough_mode %d. \n", ipacm_ip_passthrough_mode); - - ipa_num_wlan_guest_ap = cfg->num_wlan_guest_ap; - IPACMDBG_H("ipa_num_wlan_guest_ap %d\n",ipa_num_wlan_guest_ap); - - /* Allocate more non-nat entries if the monitored iface dun have Tx/Rx properties */ - if (pNatIfaces != NULL) - { - free(pNatIfaces); - pNatIfaces = NULL; - IPACMDBG_H("RESET IPACM_Config::pNatIfaces \n"); - } - ipa_nat_iface_entries = 0; - pNatIfaces = (NatIfaces *)calloc(ipa_num_ipa_interfaces, sizeof(NatIfaces)); - if (pNatIfaces == NULL) - { - IPACMERR("unable to allocate nat ifaces\n"); - ret = IPACM_FAILURE; - free(iface_table); - free(alg_table); - goto fail; - } - - /* Construct the routing table ictol name in iface static member*/ - rt_tbl_default_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_default_v4.name, V4_DEFAULT_ROUTE_TABLE_NAME, sizeof(rt_tbl_default_v4.name)); - - rt_tbl_lan_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_lan_v4.name, V4_LAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_lan_v4.name)); - - rt_tbl_wan_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_wan_v4.name, V4_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v4.name)); - - rt_tbl_v6.ip = IPA_IP_v6; - strncpy(rt_tbl_v6.name, V6_COMMON_ROUTE_TABLE_NAME, sizeof(rt_tbl_v6.name)); - - rt_tbl_wan_v6.ip = IPA_IP_v6; - strncpy(rt_tbl_wan_v6.name, V6_WAN_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_v6.name)); - - rt_tbl_odu_v4.ip = IPA_IP_v4; - strncpy(rt_tbl_odu_v4.name, V4_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v4.name)); - - rt_tbl_odu_v6.ip = IPA_IP_v6; - strncpy(rt_tbl_odu_v6.name, V6_ODU_ROUTE_TABLE_NAME, sizeof(rt_tbl_odu_v6.name)); - - rt_tbl_wan_dl.ip = IPA_IP_MAX; - strncpy(rt_tbl_wan_dl.name, WAN_DL_ROUTE_TABLE_NAME, sizeof(rt_tbl_wan_dl.name)); - - /* Construct IPACM ipa_client map to rm_resource table */ - ipa_client_rm_map_tbl[IPA_CLIENT_WLAN1_PROD]= IPA_RM_RESOURCE_WLAN_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_USB_PROD]= IPA_RM_RESOURCE_USB_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_A5_WLAN_AMPDU_PROD]= IPA_RM_RESOURCE_HSIC_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_A2_EMBEDDED_PROD]= IPA_RM_RESOURCE_Q6_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_A2_TETHERED_PROD]= IPA_RM_RESOURCE_Q6_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_APPS_LAN_WAN_PROD]= IPA_RM_RESOURCE_Q6_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_WLAN1_CONS]= IPA_RM_RESOURCE_WLAN_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_WLAN2_CONS]= IPA_RM_RESOURCE_WLAN_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_WLAN3_CONS]= IPA_RM_RESOURCE_WLAN_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_WLAN4_CONS]= IPA_RM_RESOURCE_WLAN_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_USB_CONS]= IPA_RM_RESOURCE_USB_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_A2_EMBEDDED_CONS]= IPA_RM_RESOURCE_Q6_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_A2_TETHERED_CONS]= IPA_RM_RESOURCE_Q6_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_APPS_WAN_CONS]= IPA_RM_RESOURCE_Q6_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_ODU_PROD]= IPA_RM_RESOURCE_ODU_ADAPT_PROD; - ipa_client_rm_map_tbl[IPA_CLIENT_ODU_EMB_CONS]= IPA_RM_RESOURCE_ODU_ADAPT_CONS; - ipa_client_rm_map_tbl[IPA_CLIENT_ODU_TETH_CONS]= IPA_RM_RESOURCE_ODU_ADAPT_CONS; - - /* Create the entries which IPACM wants to add dependencies on */ - ipa_rm_tbl[0].producer_rm1 = IPA_RM_RESOURCE_WLAN_PROD; - ipa_rm_tbl[0].consumer_rm1 = IPA_RM_RESOURCE_Q6_CONS; - ipa_rm_tbl[0].producer_rm2 = IPA_RM_RESOURCE_Q6_PROD; - ipa_rm_tbl[0].consumer_rm2 = IPA_RM_RESOURCE_WLAN_CONS; - - ipa_rm_tbl[1].producer_rm1 = IPA_RM_RESOURCE_USB_PROD; - ipa_rm_tbl[1].consumer_rm1 = IPA_RM_RESOURCE_Q6_CONS; - ipa_rm_tbl[1].producer_rm2 = IPA_RM_RESOURCE_Q6_PROD; - ipa_rm_tbl[1].consumer_rm2 = IPA_RM_RESOURCE_USB_CONS; - - ipa_rm_tbl[2].producer_rm1 = IPA_RM_RESOURCE_WLAN_PROD; - ipa_rm_tbl[2].consumer_rm1 = IPA_RM_RESOURCE_USB_CONS; - ipa_rm_tbl[2].producer_rm2 = IPA_RM_RESOURCE_USB_PROD; - ipa_rm_tbl[2].consumer_rm2 = IPA_RM_RESOURCE_WLAN_CONS; - - ipa_rm_tbl[3].producer_rm1 = IPA_RM_RESOURCE_ODU_ADAPT_PROD; - ipa_rm_tbl[3].consumer_rm1 = IPA_RM_RESOURCE_Q6_CONS; - ipa_rm_tbl[3].producer_rm2 = IPA_RM_RESOURCE_Q6_PROD; - ipa_rm_tbl[3].consumer_rm2 = IPA_RM_RESOURCE_ODU_ADAPT_CONS; - - ipa_rm_tbl[4].producer_rm1 = IPA_RM_RESOURCE_WLAN_PROD; - ipa_rm_tbl[4].consumer_rm1 = IPA_RM_RESOURCE_ODU_ADAPT_CONS; - ipa_rm_tbl[4].producer_rm2 = IPA_RM_RESOURCE_ODU_ADAPT_PROD; - ipa_rm_tbl[4].consumer_rm2 = IPA_RM_RESOURCE_WLAN_CONS; - - ipa_rm_tbl[5].producer_rm1 = IPA_RM_RESOURCE_ODU_ADAPT_PROD; - ipa_rm_tbl[5].consumer_rm1 = IPA_RM_RESOURCE_USB_CONS; - ipa_rm_tbl[5].producer_rm2 = IPA_RM_RESOURCE_USB_PROD; - ipa_rm_tbl[5].consumer_rm2 = IPA_RM_RESOURCE_ODU_ADAPT_CONS; - ipa_max_valid_rm_entry = 6; /* max is IPA_MAX_RM_ENTRY (6)*/ - - IPACMDBG_H(" depend MAP-0 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_WLAN_PROD, IPA_RM_RESOURCE_Q6_CONS); - IPACMDBG_H(" depend MAP-1 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_USB_PROD, IPA_RM_RESOURCE_Q6_CONS); - IPACMDBG_H(" depend MAP-2 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_WLAN_PROD, IPA_RM_RESOURCE_USB_CONS); - IPACMDBG_H(" depend MAP-3 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_ODU_ADAPT_PROD, IPA_RM_RESOURCE_Q6_CONS); - IPACMDBG_H(" depend MAP-4 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_WLAN_PROD, IPA_RM_RESOURCE_ODU_ADAPT_CONS); - IPACMDBG_H(" depend MAP-5 rm index %d to rm index: %d \n", IPA_RM_RESOURCE_ODU_ADAPT_PROD, IPA_RM_RESOURCE_USB_CONS); - -fail: - if (cfg != NULL) - { - free(cfg); - cfg = NULL; - } - - return ret; -} - -IPACM_Config* IPACM_Config::GetInstance() -{ - int res = IPACM_SUCCESS; - - if (pInstance == NULL) - { - pInstance = new IPACM_Config(); - - res = pInstance->Init(); - if (res != IPACM_SUCCESS) - { - delete pInstance; - IPACMERR("unable to initialize config instance\n"); - return NULL; - } - } - - return pInstance; -} - -int IPACM_Config::GetAlgPorts(int nPorts, ipacm_alg *pAlgPorts) -{ - if (nPorts <= 0 || pAlgPorts == NULL) - { - IPACMERR("Invalid input\n"); - return -1; - } - - for (int cnt = 0; cnt < nPorts; cnt++) - { - pAlgPorts[cnt].protocol = alg_table[cnt].protocol; - pAlgPorts[cnt].port = alg_table[cnt].port; - } - - return 0; -} - -int IPACM_Config::GetNatIfaces(int nIfaces, NatIfaces *pIfaces) -{ - if (nIfaces <= 0 || pIfaces == NULL) - { - IPACMERR("Invalid input\n"); - return -1; - } - - for (int cnt=0; cnt<nIfaces; cnt++) - { - memcpy(pIfaces[cnt].iface_name, - pNatIfaces[cnt].iface_name, - sizeof(pIfaces[cnt].iface_name)); - } - - return 0; -} - - -int IPACM_Config::AddNatIfaces(char *dev_name) -{ - int i; - /* Check if this iface already in NAT-iface*/ - for(i = 0; i < ipa_nat_iface_entries; i++) - { - if(strncmp(dev_name, - pNatIfaces[i].iface_name, - sizeof(pNatIfaces[i].iface_name)) == 0) - { - IPACMDBG("Interface (%s) is add to nat iface already\n", dev_name); - return 0; - } - } - - IPACMDBG_H("Add iface %s to NAT-ifaces, origin it has %d nat ifaces\n", - dev_name, ipa_nat_iface_entries); - ipa_nat_iface_entries++; - - if (ipa_nat_iface_entries < ipa_num_ipa_interfaces) - { - strlcpy(pNatIfaces[ipa_nat_iface_entries - 1].iface_name, - dev_name, IPA_IFACE_NAME_LEN); - - IPACMDBG_H("Add Nat IfaceName: %s ,update nat-ifaces number: %d\n", - pNatIfaces[ipa_nat_iface_entries - 1].iface_name, - ipa_nat_iface_entries); - } - - return 0; -} - -int IPACM_Config::DelNatIfaces(char *dev_name) -{ - int i = 0; - IPACMDBG_H("Del iface %s from NAT-ifaces, origin it has %d nat ifaces\n", - dev_name, ipa_nat_iface_entries); - - for (i = 0; i < ipa_nat_iface_entries; i++) - { - if (strcmp(dev_name, pNatIfaces[i].iface_name) == 0) - { - IPACMDBG_H("Find Nat IfaceName: %s ,previous nat-ifaces number: %d\n", - pNatIfaces[i].iface_name, ipa_nat_iface_entries); - - /* Reset the matched entry */ - memset(pNatIfaces[i].iface_name, 0, IPA_IFACE_NAME_LEN); - - for (; i < ipa_nat_iface_entries - 1; i++) - { - memcpy(pNatIfaces[i].iface_name, - pNatIfaces[i + 1].iface_name, IPA_IFACE_NAME_LEN); - - /* Reset the copied entry */ - memset(pNatIfaces[i + 1].iface_name, 0, IPA_IFACE_NAME_LEN); - } - ipa_nat_iface_entries--; - IPACMDBG_H("Update nat-ifaces number: %d\n", ipa_nat_iface_entries); - return 0; - } - } - - IPACMDBG_H("Can't find Nat IfaceName: %s with total nat-ifaces number: %d\n", - dev_name, ipa_nat_iface_entries); - return 0; -} - -/* for IPACM resource manager dependency usage - add either Tx or Rx ipa_rm_resource_name and - also indicate that endpoint property if valid */ -void IPACM_Config::AddRmDepend(ipa_rm_resource_name rm1,bool rx_bypass_ipa) -{ - int retval = 0; - struct ipa_ioc_rm_dependency dep; - - IPACMDBG_H(" Got rm add-depend index : %d \n", rm1); - /* ipa_rm_a2_check: IPA_RM_RESOURCE_Q6_CONS*/ - if(rm1 == IPA_RM_RESOURCE_Q6_CONS) - { - ipa_rm_a2_check+=1; - IPACMDBG_H("got %d times default RT routing from A2 \n", ipa_rm_a2_check); - } - - for(int i=0;i<ipa_max_valid_rm_entry;i++) - { - if(rm1 == ipa_rm_tbl[i].producer_rm1) - { - ipa_rm_tbl[i].producer1_up = true; - /* entry1's producer actually dun have registered Rx-property */ - ipa_rm_tbl[i].rx_bypass_ipa = rx_bypass_ipa; - IPACMDBG_H("Matched RM_table entry: %d's producer_rm1 with non_rx_prop: %d \n", i,ipa_rm_tbl[i].rx_bypass_ipa); - - if(ipa_rm_tbl[i].consumer1_up == true && ipa_rm_tbl[i].rm_set == false) - { - IPACMDBG_H("SETUP RM_table entry %d's bi-direction dependency \n", i); - /* add bi-directional dependency*/ - if(ipa_rm_tbl[i].rx_bypass_ipa) - { - IPACMDBG_H("Skip ADD entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1); - } - else - { - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm1; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1; - retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep); - IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - } - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm2; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2; - retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep); - IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - ipa_rm_tbl[i].rm_set = true; - } - else - { - IPACMDBG_H("Not SETUP RM_table entry %d: prod_up:%d, cons_up:%d, rm_set: %d \n", i,ipa_rm_tbl[i].producer1_up, ipa_rm_tbl[i].consumer1_up, ipa_rm_tbl[i].rm_set); - } - } - - if(rm1 == ipa_rm_tbl[i].consumer_rm1) - { - ipa_rm_tbl[i].consumer1_up = true; - IPACMDBG_H("Matched RM_table entry: %d's consumer_rm1 \n", i); - - if(ipa_rm_tbl[i].producer1_up == true && ipa_rm_tbl[i].rm_set == false) - { - IPACMDBG_H("SETUP RM_table entry %d's bi-direction dependency \n", i); - /* add bi-directional dependency*/ - if(ipa_rm_tbl[i].rx_bypass_ipa) - { - IPACMDBG_H("Skip ADD entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1); - } - else - { - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm1; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1; - retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep); - IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - } - - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm2; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2; - retval = ioctl(m_fd, IPA_IOC_RM_ADD_DEPENDENCY, &dep); - IPACMDBG_H("ADD entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed adding dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - ipa_rm_tbl[i].rm_set = true; - } - else - { - IPACMDBG_H("Not SETUP RM_table entry %d: prod_up:%d, cons_up:%d, rm_set: %d \n", i,ipa_rm_tbl[i].producer1_up, ipa_rm_tbl[i].consumer1_up, ipa_rm_tbl[i].rm_set); - } - } - } - return ; -} - -/* for IPACM resource manager dependency usage - delete either Tx or Rx ipa_rm_resource_name */ - -void IPACM_Config::DelRmDepend(ipa_rm_resource_name rm1) -{ - int retval = 0; - struct ipa_ioc_rm_dependency dep; - - IPACMDBG_H(" Got rm del-depend index : %d \n", rm1); - /* ipa_rm_a2_check: IPA_RM_RESOURCE_Q6_CONS*/ - if(rm1 == IPA_RM_RESOURCE_Q6_CONS) - { - ipa_rm_a2_check-=1; - IPACMDBG_H("Left %d times default RT routing from A2 \n", ipa_rm_a2_check); - } - - for(int i=0;i<ipa_max_valid_rm_entry;i++) - { - - if(rm1 == ipa_rm_tbl[i].producer_rm1) - { - if(ipa_rm_tbl[i].rm_set == true) - { - IPACMDBG_H("Matched RM_table entry: %d's producer_rm1 and dependency is up \n", i); - ipa_rm_tbl[i].rm_set = false; - - /* delete bi-directional dependency*/ - if(ipa_rm_tbl[i].rx_bypass_ipa) - { - IPACMDBG_H("Skip DEL entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1); - } - else - { - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm1; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1; - retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep); - IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - } - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm2; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2; - retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep); - IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - } - ipa_rm_tbl[i].producer1_up = false; - ipa_rm_tbl[i].rx_bypass_ipa = false; - } - if(rm1 == ipa_rm_tbl[i].consumer_rm1) - { - /* ipa_rm_a2_check: IPA_RM_RESOURCE_!6_CONS*/ - if(ipa_rm_tbl[i].consumer_rm1 == IPA_RM_RESOURCE_Q6_CONS && ipa_rm_a2_check == 1) - { - IPACMDBG_H(" still have %d default RT routing from A2 \n", ipa_rm_a2_check); - continue; - } - - if(ipa_rm_tbl[i].rm_set == true) - { - IPACMDBG_H("Matched RM_table entry: %d's consumer_rm1 and dependency is up \n", i); - ipa_rm_tbl[i].rm_set = false; - /* delete bi-directional dependency*/ - if(ipa_rm_tbl[i].rx_bypass_ipa) - { - IPACMDBG_H("Skip DEL entry %d's dependency between WLAN-Pro: %d, Con: %d \n", i, ipa_rm_tbl[i].producer_rm1,ipa_rm_tbl[i].consumer_rm1); - } - else - { - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm1; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm1; - retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep); - IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - } - - memset(&dep, 0, sizeof(dep)); - dep.resource_name = ipa_rm_tbl[i].producer_rm2; - dep.depends_on_name = ipa_rm_tbl[i].consumer_rm2; - retval = ioctl(m_fd, IPA_IOC_RM_DEL_DEPENDENCY, &dep); - IPACMDBG_H("Delete entry %d's dependency between Pro: %d, Con: %d \n", i,dep.resource_name,dep.depends_on_name); - if (retval) - { - IPACMERR("Failed deleting dependecny for RM_table entry %d's bi-direction dependency (error:%d) \n", i,retval); - } - } - ipa_rm_tbl[i].consumer1_up = false; - } - } - return ; -} - -int IPACM_Config::SetExtProp(ipa_ioc_query_intf_ext_props *prop) -{ - int i, num; - - if(prop == NULL || prop->num_ext_props <= 0) - { - IPACMERR("There is no extended property!\n"); - return IPACM_FAILURE; - } - - num = prop->num_ext_props; - for(i=0; i<num; i++) - { - if(prop->ext[i].ip == IPA_IP_v4) - { - if(ext_prop_v4.num_ext_props >= MAX_NUM_EXT_PROPS) - { - IPACMERR("IPv4 extended property table is full!\n"); - continue; - } - memcpy(&ext_prop_v4.prop[ext_prop_v4.num_ext_props], &prop->ext[i], sizeof(struct ipa_ioc_ext_intf_prop)); - ext_prop_v4.num_ext_props++; - } - else if(prop->ext[i].ip == IPA_IP_v6) - { - if(ext_prop_v6.num_ext_props >= MAX_NUM_EXT_PROPS) - { - IPACMERR("IPv6 extended property table is full!\n"); - continue; - } - memcpy(&ext_prop_v6.prop[ext_prop_v6.num_ext_props], &prop->ext[i], sizeof(struct ipa_ioc_ext_intf_prop)); - ext_prop_v6.num_ext_props++; - } - else - { - IPACMERR("The IP type is not expected!\n"); - return IPACM_FAILURE; - } - } - - IPACMDBG_H("Set extended property succeeded.\n"); - - return IPACM_SUCCESS; -} - -ipacm_ext_prop* IPACM_Config::GetExtProp(ipa_ip_type ip_type) -{ - if(ip_type == IPA_IP_v4) - return &ext_prop_v4; - else if(ip_type == IPA_IP_v6) - return &ext_prop_v6; - else - { - IPACMERR("Failed to get extended property: the IP version is neither IPv4 nor IPv6!\n"); - return NULL; - } -} - -int IPACM_Config::DelExtProp(ipa_ip_type ip_type) -{ - if(ip_type != IPA_IP_v6) - { - memset(&ext_prop_v4, 0, sizeof(ext_prop_v4)); - } - - if(ip_type != IPA_IP_v4) - { - memset(&ext_prop_v6, 0, sizeof(ext_prop_v6)); - } - - return IPACM_SUCCESS; -} - -const char* IPACM_Config::getEventName(ipa_cm_event_id event_id) -{ - if(event_id >= sizeof(ipacm_event_name)/sizeof(ipacm_event_name[0])) - { - IPACMERR("Event name array is not consistent with event array!\n"); - return NULL; - } - - return ipacm_event_name[event_id]; -} diff --git a/ipacm/src/IPACM_ConntrackClient.cpp b/ipacm/src/IPACM_ConntrackClient.cpp deleted file mode 100644 index 146cedb..0000000 --- a/ipacm/src/IPACM_ConntrackClient.cpp +++ /dev/null @@ -1,652 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/ioctl.h> -#include <net/if.h> -#include "IPACM_Iface.h" -#include "IPACM_ConntrackListener.h" -#include "IPACM_ConntrackClient.h" -#include "IPACM_Log.h" - -#define LO_NAME "lo" - -extern IPACM_EvtDispatcher cm_dis; -extern void ParseCTMessage(struct nf_conntrack *ct); - -IPACM_ConntrackClient *IPACM_ConntrackClient::pInstance = NULL; -IPACM_ConntrackListener *CtList = NULL; - -/* ================================ - Local Function Definitions - ================================= -*/ -IPACM_ConntrackClient::IPACM_ConntrackClient() -{ - IPACMDBG("\n"); - - tcp_hdl = NULL; - udp_hdl = NULL; - tcp_filter = NULL; - udp_filter = NULL; -} - -IPACM_ConntrackClient* IPACM_ConntrackClient::GetInstance() -{ - if(pInstance == NULL) - { - pInstance = new IPACM_ConntrackClient(); - - pInstance->udp_filter = nfct_filter_create(); - if(pInstance->udp_filter == NULL) - { - IPACMERR("unable to create UDP filter\n"); - delete pInstance; - return NULL; - } - IPACMDBG("Created UDP filter\n"); - - pInstance->tcp_filter = nfct_filter_create(); - if(pInstance->tcp_filter == NULL) - { - IPACMERR("unable to create TCP filter\n"); - delete pInstance; - return NULL; - } - IPACMDBG("Created TCP filter\n"); - } - - return pInstance; -} - -int IPACM_ConntrackClient::IPAConntrackEventCB -( - enum nf_conntrack_msg_type type, - struct nf_conntrack *ct, - void *data - ) -{ - ipacm_cmd_q_data evt_data; - ipacm_ct_evt_data *ct_data; - uint8_t ip_type = 0; - - IPACMDBG("Event callback called with msgtype: %d\n",type); - - /* Retrieve ip type */ - ip_type = nfct_get_attr_u8(ct, ATTR_REPL_L3PROTO); - -#ifndef CT_OPT - if(AF_INET6 == ip_type) - { - IPACMDBG("Ignoring ipv6(%d) connections\n", ip_type); - goto IGNORE; - } - -#endif - - ct_data = (ipacm_ct_evt_data *)malloc(sizeof(ipacm_ct_evt_data)); - if(ct_data == NULL) - { - IPACMERR("unable to allocate memory \n"); - goto IGNORE; - } - - ct_data->ct = ct; - ct_data->type = type; - - evt_data.event = IPA_PROCESS_CT_MESSAGE; - evt_data.evt_data = (void *)ct_data; - -#ifdef CT_OPT - if(AF_INET6 == ip_type) - { - evt_data.event = IPA_PROCESS_CT_MESSAGE_V6; - } -#endif - - if(0 != IPACM_EvtDispatcher::PostEvt(&evt_data)) - { - IPACMERR("Error sending Conntrack message to processing thread!\n"); - free(ct_data); - goto IGNORE; - } - -/* NFCT_CB_STOLEN means that the conntrack object is not released after the - callback That must be manually done later when the object is no longer needed. */ - return NFCT_CB_STOLEN; - -IGNORE: - nfct_destroy(ct); - return NFCT_CB_STOLEN; - -} - -int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Bridge_Addrs -( - struct nfct_filter *filter -) -{ - int fd; - fd = socket(AF_INET, SOCK_DGRAM, 0); - if(fd < 0) - { - PERROR("unable to open socket"); - return -1; - } - - int ret; - uint32_t ipv4_addr; - struct ifreq ifr; - - /* retrieve bridge interface ipv4 address */ - memset(&ifr, 0, sizeof(struct ifreq)); - ifr.ifr_addr.sa_family = AF_INET; - (void)strncpy(ifr.ifr_name, IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, sizeof(ifr.ifr_name)); - IPACMDBG("bridge interface name (%s)\n", ifr.ifr_name); - - ret = ioctl(fd, SIOCGIFADDR, &ifr); - if (ret < 0) - { - IPACMERR("unable to retrieve (%s) interface address\n",ifr.ifr_name); - close(fd); - return -1; - } - IPACMDBG("Interface (%s) address %s\n", ifr.ifr_name, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); - ipv4_addr = ntohl(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr.s_addr); - close(fd); - - /* ignore whatever is destined to or originates from broadcast ip address */ - struct nfct_filter_ipv4 filter_ipv4; - - filter_ipv4.addr = ipv4_addr; - filter_ipv4.mask = 0xffffffff; - - nfct_filter_set_logic(filter, - NFCT_FILTER_DST_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4); - - nfct_filter_set_logic(filter, - NFCT_FILTER_SRC_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4); - - return 0; -} - -int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Local_Iface -( - struct nfct_filter *filter, - ipacm_event_iface_up *param -) -{ - struct nfct_filter_ipv4 filter_ipv4; - - filter_ipv4.addr = param->ipv4_addr; - filter_ipv4.mask = 0xffffffff; - - /* ignore whatever is destined to local interfaces */ - IPACMDBG("Ignore connections destinated to interface %s", param->ifname); - iptodot("with ipv4 address", param->ipv4_addr); - nfct_filter_set_logic(filter, - NFCT_FILTER_DST_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4); - - IPACMDBG("Ignore connections orignated from interface %s", param->ifname); - iptodot("with ipv4 address", filter_ipv4.addr); - nfct_filter_set_logic(filter, - NFCT_FILTER_SRC_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4); - - /* Retrieve broadcast address */ - /* Intialize with 255.255.255.255 */ - uint32_t bc_ip_addr = 0xFFFFFFFF; - - /* calculate broadcast address from addr and addr_mask */ - bc_ip_addr = (bc_ip_addr & (~param->addr_mask)); - bc_ip_addr = (bc_ip_addr | (param->ipv4_addr & param->addr_mask)); - - /* netfitler expecting in host-byte order */ - filter_ipv4.addr = bc_ip_addr; - filter_ipv4.mask = 0xffffffff; - - iptodot("with broadcast address", filter_ipv4.addr); - nfct_filter_set_logic(filter, - NFCT_FILTER_DST_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4); - - return 0; -} - -/* Function which sets up filters to ignore - connections to and from local interfaces */ -int IPACM_ConntrackClient::IPA_Conntrack_Filters_Ignore_Local_Addrs -( - struct nfct_filter *filter -) -{ - struct nfct_filter_ipv4 filter_ipv4; - - /* ignore whatever is destined to or originates from broadcast ip address */ - filter_ipv4.addr = 0xffffffff; - filter_ipv4.mask = 0xffffffff; - - nfct_filter_set_logic(filter, - NFCT_FILTER_DST_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_DST_IPV4, &filter_ipv4); - - nfct_filter_set_logic(filter, - NFCT_FILTER_SRC_IPV4, - NFCT_FILTER_LOGIC_NEGATIVE); - - nfct_filter_add_attr(filter, NFCT_FILTER_SRC_IPV4, &filter_ipv4); - - return 0; -} /* IPA_Conntrack_Filters_Ignore_Local_Addrs() */ - -/* Initialize TCP Filter */ -int IPACM_ConntrackClient::IPA_Conntrack_TCP_Filter_Init(void) -{ - int ret = 0; - IPACM_ConntrackClient *pClient; - - IPACMDBG("\n"); - - pClient = IPACM_ConntrackClient::GetInstance(); - if(pClient == NULL) - { - IPACMERR("unable to get conntrack client instance\n"); - return -1; - } - - ret = nfct_filter_set_logic(pClient->tcp_filter, - NFCT_FILTER_L4PROTO, - NFCT_FILTER_LOGIC_POSITIVE); - if(ret == -1) - { - IPACMERR("Unable to set filter logic\n"); - return -1; - } - - /* set protocol filters as tcp and udp */ - nfct_filter_add_attr_u32(pClient->tcp_filter, NFCT_FILTER_L4PROTO, IPPROTO_TCP); - - - struct nfct_filter_proto tcp_proto_state; - tcp_proto_state.proto = IPPROTO_TCP; - tcp_proto_state.state = TCP_CONNTRACK_ESTABLISHED; - - ret = nfct_filter_set_logic(pClient->tcp_filter, - NFCT_FILTER_L4PROTO_STATE, - NFCT_FILTER_LOGIC_POSITIVE); - if(ret == -1) - { - IPACMERR("unable to set filter logic\n"); - return -1; - } - nfct_filter_add_attr(pClient->tcp_filter, - NFCT_FILTER_L4PROTO_STATE, - &tcp_proto_state); - - - tcp_proto_state.proto = IPPROTO_TCP; - tcp_proto_state.state = TCP_CONNTRACK_FIN_WAIT; - ret = nfct_filter_set_logic(pClient->tcp_filter, - NFCT_FILTER_L4PROTO_STATE, - NFCT_FILTER_LOGIC_POSITIVE); - if(ret == -1) - { - IPACMERR("unable to set filter logic\n"); - return -1; - } - - nfct_filter_add_attr(pClient->tcp_filter, - NFCT_FILTER_L4PROTO_STATE, - &tcp_proto_state); - return 0; -} - - -/* Initialize UDP Filter */ -int IPACM_ConntrackClient::IPA_Conntrack_UDP_Filter_Init(void) -{ - int ret = 0; - IPACM_ConntrackClient *pClient = IPACM_ConntrackClient::GetInstance(); - if(pClient == NULL) - { - IPACMERR("unable to get conntrack client instance\n"); - return -1; - } - - ret = nfct_filter_set_logic(pClient->udp_filter, - NFCT_FILTER_L4PROTO, - NFCT_FILTER_LOGIC_POSITIVE); - if(ret == -1) - { - IPACMERR("unable to set filter logic\n"); - } - /* set protocol filters as tcp and udp */ - nfct_filter_add_attr_u32(pClient->udp_filter, NFCT_FILTER_L4PROTO, IPPROTO_UDP); - - return 0; -} - -void* IPACM_ConntrackClient::UDPConnTimeoutUpdate(void *ptr) -{ - - NatApp *nat_inst = NULL; -#ifdef IPACM_DEBUG - IPACMDBG("\n"); -#endif - - nat_inst = NatApp::GetInstance(); - if(nat_inst == NULL) - { - IPACMERR("unable to create nat instance\n"); - return NULL; - } - - while(1) - { - nat_inst->UpdateUDPTimeStamp(); - sleep(UDP_TIMEOUT_UPDATE); - } /* end of while(1) loop */ - -#ifdef IPACM_DEBUG - IPACMDBG("Returning from %s() %d\n", __FUNCTION__, __LINE__); -#endif - - return NULL; -} - -/* Thread to initialize TCP Conntrack Filters*/ -void* IPACM_ConntrackClient::TCPRegisterWithConnTrack(void *) -{ - int ret; - IPACM_ConntrackClient *pClient; - unsigned subscrips = 0; - - IPACMDBG("\n"); - - pClient = IPACM_ConntrackClient::GetInstance(); - if(pClient == NULL) - { - IPACMERR("unable to get conntrack client instance\n"); - return NULL; - } - - subscrips = (NF_NETLINK_CONNTRACK_UPDATE | NF_NETLINK_CONNTRACK_DESTROY); -#ifdef CT_OPT - subscrips |= NF_NETLINK_CONNTRACK_NEW; -#endif - - pClient->tcp_hdl = nfct_open(CONNTRACK, subscrips); - if(pClient->tcp_hdl == NULL) - { - PERROR("nfct_open\n"); - return NULL; - } - - /* Initialize the filter */ - ret = IPA_Conntrack_TCP_Filter_Init(); - if(ret == -1) - { - IPACMERR("Unable to initliaze TCP Filter\n"); - return NULL; - } - - /* Attach the filter to net filter handler */ - ret = nfct_filter_attach(nfct_fd(pClient->tcp_hdl), pClient->tcp_filter); - if(ret == -1) - { - IPACMDBG("unable to attach TCP filter\n"); - return NULL; - } - - /* Register callback with netfilter handler */ - IPACMDBG_H("tcp handle:%p, fd:%d\n", pClient->tcp_hdl, nfct_fd(pClient->tcp_hdl)); -#ifndef CT_OPT - nfct_callback_register(pClient->tcp_hdl, - (nf_conntrack_msg_type) (NFCT_T_UPDATE | NFCT_T_DESTROY | NFCT_T_NEW), - IPAConntrackEventCB, NULL); -#else - nfct_callback_register(pClient->tcp_hdl, (nf_conntrack_msg_type) NFCT_T_ALL, IPAConntrackEventCB, NULL); -#endif - - /* Block to catch events from net filter connection track */ - /* nfct_catch() receives conntrack events from kernel-space, by default it - blocks waiting for events. */ - IPACMDBG("Waiting for events\n"); - - ret = nfct_catch(pClient->tcp_hdl); - if(ret == -1) - { - IPACMERR("(%d)(%s)\n", ret, strerror(errno)); - return NULL; - } - - IPACMDBG("Exit from tcp thread\n"); - - /* destroy the filter.. this will not detach the filter */ - nfct_filter_destroy(pClient->tcp_filter); - pClient->tcp_filter = NULL; - - /* de-register the callback */ - nfct_callback_unregister(pClient->tcp_hdl); - /* close the handle */ - nfct_close(pClient->tcp_hdl); - pClient->tcp_hdl = NULL; - - pthread_exit(NULL); - return NULL; -} - -/* Thread to initialize UDP Conntrack Filters*/ -void* IPACM_ConntrackClient::UDPRegisterWithConnTrack(void *) -{ - int ret; - IPACM_ConntrackClient *pClient = NULL; - - IPACMDBG("\n"); - - pClient = IPACM_ConntrackClient::GetInstance(); - if(pClient == NULL) - { - IPACMERR("unable to retrieve instance of conntrack client\n"); - return NULL; - } - - pClient->udp_hdl = nfct_open(CONNTRACK, - (NF_NETLINK_CONNTRACK_NEW | NF_NETLINK_CONNTRACK_DESTROY)); - if(pClient->udp_hdl == NULL) - { - PERROR("nfct_open\n"); - return NULL; - } - - /* Initialize Filter */ - ret = IPA_Conntrack_UDP_Filter_Init(); - if(-1 == ret) - { - IPACMDBG("Unable to initalize udp filters\n"); - return NULL; - } - - /* Attach the filter to net filter handler */ - ret = nfct_filter_attach(nfct_fd(pClient->udp_hdl), pClient->udp_filter); - if(ret == -1) - { - IPACMDBG("unable to attach the filter\n"); - return NULL; - } - - /* Register callback with netfilter handler */ - IPACMDBG_H("udp handle:%p, fd:%d\n", pClient->udp_hdl, nfct_fd(pClient->udp_hdl)); - nfct_callback_register(pClient->udp_hdl, - (nf_conntrack_msg_type)(NFCT_T_NEW | NFCT_T_DESTROY), - IPAConntrackEventCB, - NULL); - - /* Block to catch events from net filter connection track */ -ctcatch: - ret = nfct_catch(pClient->udp_hdl); - if(ret == -1) - { - IPACMDBG("(%d)(%s)\n", ret, strerror(errno)); - return NULL; - } - else - { - IPACMDBG("ctcatch ret:%d\n", ret); - goto ctcatch; - } - - IPACMDBG("Exit from udp thread with ret: %d\n", ret); - - /* destroy the filter.. this will not detach the filter */ - nfct_filter_destroy(pClient->udp_filter); - pClient->udp_filter = NULL; - - /* de-register the callback */ - nfct_callback_unregister(pClient->udp_hdl); - /* close the handle */ - nfct_close(pClient->udp_hdl); - pClient->udp_hdl = NULL; - - pthread_exit(NULL); - return NULL; -} - -void IPACM_ConntrackClient::UpdateUDPFilters(void *param, bool isWan) -{ - static bool isIgnore = false; - int ret = 0; - IPACM_ConntrackClient *pClient = NULL; - - pClient = IPACM_ConntrackClient::GetInstance(); - if(pClient == NULL) - { - IPACMERR("unable to retrieve conntrack client instance\n"); - return; - } - - if(pClient->udp_filter == NULL) - { - return; - } - - if(!isWan) - { - IPA_Conntrack_Filters_Ignore_Local_Iface(pClient->udp_filter, - (ipacm_event_iface_up *)param); - - if(!isIgnore) - { - IPA_Conntrack_Filters_Ignore_Bridge_Addrs(pClient->udp_filter); - IPA_Conntrack_Filters_Ignore_Local_Addrs(pClient->udp_filter); - isIgnore = true; - } - } - - /* Attach the filter to udp handle */ - if(pClient->udp_hdl != NULL) - { - IPACMDBG("attaching the filter to udp handle\n"); - ret = nfct_filter_attach(nfct_fd(pClient->udp_hdl), pClient->udp_filter); - if(ret == -1) - { - PERROR("unable to attach the filter to udp handle\n"); - IPACMERR("udp handle:%p, fd:%d Error: %d\n",pClient->udp_hdl, nfct_fd(pClient->udp_hdl), ret); - return; - } - } - - return; -} - -void IPACM_ConntrackClient::UpdateTCPFilters(void *param, bool isWan) -{ - static bool isIgnore = false; - int ret = 0; - IPACM_ConntrackClient *pClient = NULL; - - pClient = IPACM_ConntrackClient::GetInstance(); - if(pClient == NULL) - { - IPACMERR("unable to retrieve conntrack client instance\n"); - return; - } - - if(pClient->tcp_filter == NULL) - return; - - if(!isWan) - { - IPA_Conntrack_Filters_Ignore_Local_Iface(pClient->tcp_filter, - (ipacm_event_iface_up *)param); - - if(!isIgnore) - { - IPA_Conntrack_Filters_Ignore_Bridge_Addrs(pClient->udp_filter); - IPA_Conntrack_Filters_Ignore_Local_Addrs(pClient->udp_filter); - isIgnore = true; - } - } - - /* Attach the filter to tcp handle */ - if(pClient->tcp_hdl != NULL) - { - IPACMDBG("attaching the filter to tcp handle\n"); - ret = nfct_filter_attach(nfct_fd(pClient->tcp_hdl), pClient->tcp_filter); - if(ret == -1) - { - PERROR("unable to attach the filter to tcp handle\n"); - IPACMERR("tcp handle:%p, fd:%d Error: %d\n",pClient->tcp_hdl, nfct_fd(pClient->tcp_hdl), ret); - return; - } - } - - return; -} - diff --git a/ipacm/src/IPACM_ConntrackListener.cpp b/ipacm/src/IPACM_ConntrackListener.cpp deleted file mode 100644 index ad3fa1e..0000000 --- a/ipacm/src/IPACM_ConntrackListener.cpp +++ /dev/null @@ -1,1209 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include <sys/ioctl.h> -#include <net/if.h> - -#include "IPACM_ConntrackListener.h" -#include "IPACM_ConntrackClient.h" -#include "IPACM_EvtDispatcher.h" -#include "IPACM_Iface.h" -#include "IPACM_Wan.h" - -IPACM_ConntrackListener::IPACM_ConntrackListener() -{ - IPACMDBG("\n"); - - isNatThreadStart = false; - isCTReg = false; - WanUp = false; - nat_inst = NatApp::GetInstance(); - - NatIfaceCnt = 0; - StaClntCnt = 0; - pNatIfaces = NULL; - pConfig = IPACM_Config::GetInstance();; - - memset(nat_iface_ipv4_addr, 0, sizeof(nat_iface_ipv4_addr)); - memset(nonnat_iface_ipv4_addr, 0, sizeof(nonnat_iface_ipv4_addr)); - memset(sta_clnt_ipv4_addr, 0, sizeof(sta_clnt_ipv4_addr)); - - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, this); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, this); - IPACM_EvtDispatcher::registr(IPA_PROCESS_CT_MESSAGE, this); - IPACM_EvtDispatcher::registr(IPA_PROCESS_CT_MESSAGE_V6, this); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WLAN_UP, this); - IPACM_EvtDispatcher::registr(IPA_HANDLE_LAN_UP, this); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, this); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, this); - -#ifdef CT_OPT - p_lan2lan = IPACM_LanToLan::getLan2LanInstance(); -#endif -} - -void IPACM_ConntrackListener::event_callback(ipa_cm_event_id evt, - void *data) -{ - ipacm_event_iface_up *wan_down = NULL; - - if(data == NULL) - { - IPACMERR("Invalid Data\n"); - return; - } - - switch(evt) - { - case IPA_PROCESS_CT_MESSAGE: - IPACMDBG("Received IPA_PROCESS_CT_MESSAGE event\n"); - ProcessCTMessage(data); - break; - -#ifdef CT_OPT - case IPA_PROCESS_CT_MESSAGE_V6: - IPACMDBG("Received IPA_PROCESS_CT_MESSAGE_V6 event\n"); - ProcessCTV6Message(data); - break; -#endif - - case IPA_HANDLE_WAN_UP: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n"); - CreateConnTrackThreads(); - TriggerWANUp(data); - break; - - case IPA_HANDLE_WAN_DOWN: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN event\n"); - wan_down = (ipacm_event_iface_up *)data; - if(isWanUp()) - { - TriggerWANDown(wan_down->ipv4_addr); - } - break; - - /* if wlan or lan comes up after wan interface, modify - tcp/udp filters to ignore local wlan or lan connections */ - case IPA_HANDLE_WLAN_UP: - case IPA_HANDLE_LAN_UP: - IPACMDBG_H("Received event: %d with ifname: %s and address: 0x%x\n", - evt, ((ipacm_event_iface_up *)data)->ifname, - ((ipacm_event_iface_up *)data)->ipv4_addr); - CreateConnTrackThreads(); - IPACM_ConntrackClient::UpdateUDPFilters(data, false); - IPACM_ConntrackClient::UpdateTCPFilters(data, false); - break; - - case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT: - IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT event\n"); - HandleNonNatIPAddr(data, true); - break; - - case IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT: - IPACMDBG("Received IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT event\n"); - HandleNonNatIPAddr(data, false); - break; - - default: - IPACMDBG("Ignore cmd %d\n", evt); - break; - } -} - -int IPACM_ConntrackListener::CheckNatIface( - ipacm_event_data_all *data, bool *NatIface) -{ - int fd = 0, len = 0, cnt, i, j; - struct ifreq ifr; - *NatIface = false; - - if (data->ipv4_addr == 0 || data->iptype != IPA_IP_v4) - { - IPACMDBG("Ignoring\n"); - return IPACM_FAILURE; - } - - IPACMDBG("Received interface index %d with ip type: %d", data->if_index, data->iptype); - iptodot(" and ipv4 address", data->ipv4_addr); - - if (pConfig == NULL) - { - pConfig = IPACM_Config::GetInstance(); - if (pConfig == NULL) - { - IPACMERR("Unable to get Config instance\n"); - return IPACM_FAILURE; - } - } - - cnt = pConfig->GetNatIfacesCnt(); - NatIfaceCnt = cnt; - IPACMDBG("Total Nat ifaces: %d\n", NatIfaceCnt); - if (pNatIfaces != NULL) - { - free(pNatIfaces); - pNatIfaces = NULL; - } - - len = (sizeof(NatIfaces) * NatIfaceCnt); - pNatIfaces = (NatIfaces *)malloc(len); - if (pNatIfaces == NULL) - { - IPACMERR("Unable to allocate memory for non nat ifaces\n"); - return IPACM_FAILURE; - } - - memset(pNatIfaces, 0, len); - if (pConfig->GetNatIfaces(NatIfaceCnt, pNatIfaces) != 0) - { - IPACMERR("Unable to retrieve non nat ifaces\n"); - return IPACM_FAILURE; - } - - /* Search/Configure linux interface-index and map it to IPA interface-index */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - PERROR("get interface name socket create failed"); - return IPACM_FAILURE; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - ifr.ifr_ifindex = data->if_index; - if (ioctl(fd, SIOCGIFNAME, &ifr) < 0) - { - PERROR("call_ioctl_on_dev: ioctl failed:"); - close(fd); - return IPACM_FAILURE; - } - close(fd); - - for (i = 0; i < NatIfaceCnt; i++) - { - if (strncmp(ifr.ifr_name, - pNatIfaces[i].iface_name, - sizeof(pNatIfaces[i].iface_name)) == 0) - { - IPACMDBG_H("Nat iface (%s), entry (%d), dont cache", - pNatIfaces[i].iface_name, i); - iptodot("with ipv4 address: ", nat_iface_ipv4_addr[i]); - *NatIface = true; - return IPACM_SUCCESS; - } - } - - return IPACM_SUCCESS; -} - -void IPACM_ConntrackListener::HandleNonNatIPAddr( - void *inParam, bool AddOp) -{ - ipacm_event_data_all *data = (ipacm_event_data_all *)inParam; - bool NatIface = false; - int cnt, ret; - - if (isStaMode) - { - IPACMDBG("In STA mode, don't add dummy rules for non nat ifaces\n"); - return; - } - - /* Handle only non nat ifaces, NAT iface should be handle - separately to avoid race conditions between route/nat - rules add/delete operations */ - if (AddOp) - { - ret = CheckNatIface(data, &NatIface); - if (!NatIface && ret == IPACM_SUCCESS) - { - /* Cache the non nat iface ip address */ - for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++) - { - if (nonnat_iface_ipv4_addr[cnt] == 0) - { - nonnat_iface_ipv4_addr[cnt] = data->ipv4_addr; - IPACMDBG("Add ip addr to non nat list (%d) ", cnt); - iptodot("with ipv4 address", nonnat_iface_ipv4_addr[cnt]); - - /* Add dummy nat rule for non nat ifaces */ - nat_inst->FlushTempEntries(data->ipv4_addr, true, true); - return; - } - } - } - } - else - { - /* for delete operation */ - for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++) - { - if (nonnat_iface_ipv4_addr[cnt] == data->ipv4_addr) - { - IPACMDBG("Reseting ct filters, entry (%d) ", cnt); - iptodot("with ipv4 address", nonnat_iface_ipv4_addr[cnt]); - nonnat_iface_ipv4_addr[cnt] = 0; - nat_inst->FlushTempEntries(data->ipv4_addr, false); - nat_inst->DelEntriesOnClntDiscon(data->ipv4_addr); - return; - } - } - - } - - return; -} - -void IPACM_ConntrackListener::HandleNeighIpAddrAddEvt( - ipacm_event_data_all *data) -{ - bool NatIface = false; - int j, ret; - - ret = CheckNatIface(data, &NatIface); - if (NatIface && ret == IPACM_SUCCESS) - { - for (j = 0; j < MAX_IFACE_ADDRESS; j++) - { - /* check if duplicate NAT ip */ - if (nat_iface_ipv4_addr[j] == data->ipv4_addr) - break; - - /* Cache the new nat iface address */ - if (nat_iface_ipv4_addr[j] == 0) - { - nat_iface_ipv4_addr[j] = data->ipv4_addr; - iptodot("Nating connections of addr: ", nat_iface_ipv4_addr[j]); - break; - } - } - - /* Add the cached temp entries to NAT table */ - if (j != MAX_IFACE_ADDRESS) - { - nat_inst->ResetPwrSaveIf(data->ipv4_addr); - nat_inst->FlushTempEntries(data->ipv4_addr, true); - } - } - return; -} - -void IPACM_ConntrackListener::HandleNeighIpAddrDelEvt( - uint32_t ipv4_addr) -{ - int cnt; - - if(ipv4_addr == 0) - { - IPACMDBG("Ignoring\n"); - return; - } - - iptodot("HandleNeighIpAddrDelEvt(): Received ip addr", ipv4_addr); - for(cnt = 0; cnt<MAX_IFACE_ADDRESS; cnt++) - { - if (nat_iface_ipv4_addr[cnt] == ipv4_addr) - { - IPACMDBG("Reseting ct nat iface, entry (%d) ", cnt); - iptodot("with ipv4 address", nat_iface_ipv4_addr[cnt]); - nat_iface_ipv4_addr[cnt] = 0; - nat_inst->FlushTempEntries(ipv4_addr, false); - nat_inst->DelEntriesOnClntDiscon(ipv4_addr); - } - } - - return; -} - -void IPACM_ConntrackListener::TriggerWANUp(void *in_param) -{ - ipacm_event_iface_up *wanup_data = (ipacm_event_iface_up *)in_param; - - IPACMDBG_H("Recevied below information during wanup,\n"); - IPACMDBG_H("if_name:%s, ipv4_address:0x%x\n", - wanup_data->ifname, wanup_data->ipv4_addr); - - if(wanup_data->ipv4_addr == 0) - { - IPACMERR("Invalid ipv4 address,ignoring IPA_HANDLE_WAN_UP event\n"); - return; - } - - if(isWanUp()) - { - if (wan_ipaddr != wanup_data->ipv4_addr) - TriggerWANDown(wan_ipaddr); - else - return; - } - - WanUp = true; - isStaMode = wanup_data->is_sta; - IPACMDBG("isStaMode: %d\n", isStaMode); - - wan_ipaddr = wanup_data->ipv4_addr; - memcpy(wan_ifname, wanup_data->ifname, sizeof(wan_ifname)); - - if(nat_inst != NULL) - { - nat_inst->AddTable(wanup_data->ipv4_addr); - } - - IPACMDBG("creating nat threads\n"); - CreateNatThreads(); -} - -int IPACM_ConntrackListener::CreateConnTrackThreads(void) -{ - int ret; - pthread_t tcp_thread = 0, udp_thread = 0; - - if(isCTReg == false) - { - if(!tcp_thread) - { - ret = pthread_create(&tcp_thread, NULL, IPACM_ConntrackClient::TCPRegisterWithConnTrack, NULL); - if(0 != ret) - { - IPACMERR("unable to create TCP conntrack event listner thread\n"); - PERROR("unable to create TCP conntrack\n"); - return -1; - } - - IPACMDBG("created TCP conntrack event listner thread\n"); - if(pthread_setname_np(tcp_thread, "tcp ct listener") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } - - if(!udp_thread) - { - ret = pthread_create(&udp_thread, NULL, IPACM_ConntrackClient::UDPRegisterWithConnTrack, NULL); - if(0 != ret) - { - IPACMERR("unable to create UDP conntrack event listner thread\n"); - PERROR("unable to create UDP conntrack\n"); - goto error; - } - - IPACMDBG("created UDP conntrack event listner thread\n"); - if(pthread_setname_np(udp_thread, "udp ct listener") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } - - isCTReg = true; - } - - return 0; - -error: - return -1; -} -int IPACM_ConntrackListener::CreateNatThreads(void) -{ - int ret; - pthread_t udpcto_thread = 0; - - if(isNatThreadStart == false) - { - if(!udpcto_thread) - { - ret = pthread_create(&udpcto_thread, NULL, IPACM_ConntrackClient::UDPConnTimeoutUpdate, NULL); - if(0 != ret) - { - IPACMERR("unable to create udp conn timeout thread\n"); - PERROR("unable to create udp conn timeout\n"); - goto error; - } - - IPACMDBG("created upd conn timeout thread\n"); - if(pthread_setname_np(udpcto_thread, "udp conn timeout") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } - - isNatThreadStart = true; - } - return 0; - -error: - return -1; -} - -void IPACM_ConntrackListener::TriggerWANDown(uint32_t wan_addr) -{ - int ret = 0; - IPACMDBG_H("Deleting ipv4 nat table with"); - IPACMDBG_H(" public ip address(0x%x): %d.%d.%d.%d\n", wan_addr, - ((wan_addr>>24) & 0xFF), ((wan_addr>>16) & 0xFF), - ((wan_addr>>8) & 0xFF), (wan_addr & 0xFF)); - - if(nat_inst != NULL) - { - ret = nat_inst->DeleteTable(wan_addr); - if (ret) - return; - - WanUp = false; - wan_ipaddr = 0; - } -} - - -void ParseCTMessage(struct nf_conntrack *ct) -{ - uint32_t status, timeout; - IPACMDBG("Printing conntrack parameters\n"); - - iptodot("ATTR_IPV4_SRC = ATTR_ORIG_IPV4_SRC:", nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC)); - iptodot("ATTR_IPV4_DST = ATTR_ORIG_IPV4_DST:", nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST)); - IPACMDBG("ATTR_PORT_SRC = ATTR_ORIG_PORT_SRC: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC)); - IPACMDBG("ATTR_PORT_DST = ATTR_ORIG_PORT_DST: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST)); - - iptodot("ATTR_REPL_IPV4_SRC:", nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC)); - iptodot("ATTR_REPL_IPV4_DST:", nfct_get_attr_u32(ct, ATTR_REPL_IPV4_DST)); - IPACMDBG("ATTR_REPL_PORT_SRC: 0x%x\n", nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC)); - IPACMDBG("ATTR_REPL_PORT_DST: 0x%x\n", nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST)); - - iptodot("ATTR_SNAT_IPV4:", nfct_get_attr_u32(ct, ATTR_SNAT_IPV4)); - iptodot("ATTR_DNAT_IPV4:", nfct_get_attr_u32(ct, ATTR_DNAT_IPV4)); - IPACMDBG("ATTR_SNAT_PORT: 0x%x\n", nfct_get_attr_u16(ct, ATTR_SNAT_PORT)); - IPACMDBG("ATTR_DNAT_PORT: 0x%x\n", nfct_get_attr_u16(ct, ATTR_DNAT_PORT)); - - IPACMDBG("ATTR_MARK: 0x%x\n", nfct_get_attr_u32(ct, ATTR_MARK)); - IPACMDBG("ATTR_USE: 0x%x\n", nfct_get_attr_u32(ct, ATTR_USE)); - IPACMDBG("ATTR_ID: 0x%x\n", nfct_get_attr_u32(ct, ATTR_ID)); - - status = nfct_get_attr_u32(ct, ATTR_STATUS); - IPACMDBG("ATTR_STATUS: 0x%x\n", status); - - timeout = nfct_get_attr_u32(ct, ATTR_TIMEOUT); - IPACMDBG("ATTR_TIMEOUT: 0x%x\n", timeout); - - if(IPS_SRC_NAT & status) - { - IPACMDBG("IPS_SRC_NAT set\n"); - } - - if(IPS_DST_NAT & status) - { - IPACMDBG("IPS_DST_NAT set\n"); - } - - if(IPS_SRC_NAT_DONE & status) - { - IPACMDBG("IPS_SRC_NAT_DONE set\n"); - } - - if(IPS_DST_NAT_DONE & status) - { - IPACMDBG(" IPS_DST_NAT_DONE set\n"); - } - - IPACMDBG("\n"); - return; -} - -void ParseCTV6Message(struct nf_conntrack *ct) -{ - uint32_t status, timeout; - struct nfct_attr_grp_ipv6 orig_params; - uint8_t l4proto, tcp_flags, tcp_state; - - IPACMDBG("Printing conntrack parameters\n"); - - nfct_get_attr_grp(ct, ATTR_GRP_ORIG_IPV6, (void *)&orig_params); - IPACMDBG("Orig src_v6_addr: 0x%08x%08x%08x%08x\n", orig_params.src[0], orig_params.src[1], - orig_params.src[2], orig_params.src[3]); - IPACMDBG("Orig dst_v6_addr: 0x%08x%08x%08x%08x\n", orig_params.dst[0], orig_params.dst[1], - orig_params.dst[2], orig_params.dst[3]); - - IPACMDBG("ATTR_PORT_SRC = ATTR_ORIG_PORT_SRC: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC)); - IPACMDBG("ATTR_PORT_DST = ATTR_ORIG_PORT_DST: 0x%x\n", nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST)); - - IPACMDBG("ATTR_MARK: 0x%x\n", nfct_get_attr_u32(ct, ATTR_MARK)); - IPACMDBG("ATTR_USE: 0x%x\n", nfct_get_attr_u32(ct, ATTR_USE)); - IPACMDBG("ATTR_ID: 0x%x\n", nfct_get_attr_u32(ct, ATTR_ID)); - - timeout = nfct_get_attr_u32(ct, ATTR_TIMEOUT); - IPACMDBG("ATTR_TIMEOUT: 0x%x\n", timeout); - - status = nfct_get_attr_u32(ct, ATTR_STATUS); - IPACMDBG("ATTR_STATUS: 0x%x\n", status); - - l4proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); - IPACMDBG("ATTR_ORIG_L4PROTO: 0x%x\n", l4proto); - if(l4proto == IPPROTO_TCP) - { - tcp_state = nfct_get_attr_u8(ct, ATTR_TCP_STATE); - IPACMDBG("ATTR_TCP_STATE: 0x%x\n", tcp_state); - - tcp_flags = nfct_get_attr_u8(ct, ATTR_TCP_FLAGS_ORIG); - IPACMDBG("ATTR_TCP_FLAGS_ORIG: 0x%x\n", tcp_flags); - } - - IPACMDBG("\n"); - return; -} - -#ifdef CT_OPT -void IPACM_ConntrackListener::ProcessCTV6Message(void *param) -{ - ipacm_ct_evt_data *evt_data = (ipacm_ct_evt_data *)param; - u_int8_t l4proto = 0; - uint32_t status = 0; - struct nf_conntrack *ct = evt_data->ct; - -#ifdef IPACM_DEBUG - char buf[1024]; - - /* Process message and generate ioctl call to kernel thread */ - nfct_snprintf(buf, sizeof(buf), evt_data->ct, - evt_data->type, NFCT_O_PLAIN, NFCT_OF_TIME); - IPACMDBG("%s\n", buf); - IPACMDBG("\n"); - ParseCTV6Message(ct); -#endif - - if(p_lan2lan == NULL) - { - IPACMERR("Lan2Lan Instance is null\n"); - goto IGNORE; - } - - status = nfct_get_attr_u32(ct, ATTR_STATUS); - if((IPS_DST_NAT & status) || (IPS_SRC_NAT & status)) - { - IPACMDBG("Either Destination or Source nat flag Set\n"); - goto IGNORE; - } - - l4proto = nfct_get_attr_u8(ct, ATTR_ORIG_L4PROTO); - if(IPPROTO_UDP != l4proto && IPPROTO_TCP != l4proto) - { - IPACMDBG("Received unexpected protocl %d conntrack message\n", l4proto); - goto IGNORE; - } - - IPACMDBG("Neither Destination nor Source nat flag Set\n"); - struct nfct_attr_grp_ipv6 orig_params; - nfct_get_attr_grp(ct, ATTR_GRP_ORIG_IPV6, (void *)&orig_params); - - ipacm_event_connection lan2lan_conn; - lan2lan_conn.iptype = IPA_IP_v6; - memcpy(lan2lan_conn.src_ipv6_addr, orig_params.src, - sizeof(lan2lan_conn.src_ipv6_addr)); - IPACMDBG("Before convert, src_v6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.src_ipv6_addr[0], lan2lan_conn.src_ipv6_addr[1], - lan2lan_conn.src_ipv6_addr[2], lan2lan_conn.src_ipv6_addr[3]); - for(int cnt=0; cnt<4; cnt++) - { - lan2lan_conn.src_ipv6_addr[cnt] = ntohl(lan2lan_conn.src_ipv6_addr[cnt]); - } - IPACMDBG("After convert src_v6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.src_ipv6_addr[0], lan2lan_conn.src_ipv6_addr[1], - lan2lan_conn.src_ipv6_addr[2], lan2lan_conn.src_ipv6_addr[3]); - - memcpy(lan2lan_conn.dst_ipv6_addr, orig_params.dst, - sizeof(lan2lan_conn.dst_ipv6_addr)); - IPACMDBG("Before convert, dst_ipv6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.dst_ipv6_addr[0], lan2lan_conn.dst_ipv6_addr[1], - lan2lan_conn.dst_ipv6_addr[2], lan2lan_conn.dst_ipv6_addr[3]); - for(int cnt=0; cnt<4; cnt++) - { - lan2lan_conn.dst_ipv6_addr[cnt] = ntohl(lan2lan_conn.dst_ipv6_addr[cnt]); - } - IPACMDBG("After convert, dst_ipv6_addr: 0x%08x%08x%08x%08x\n", lan2lan_conn.dst_ipv6_addr[0], lan2lan_conn.dst_ipv6_addr[1], - lan2lan_conn.dst_ipv6_addr[2], lan2lan_conn.dst_ipv6_addr[3]); - - if(((IPPROTO_UDP == l4proto) && (NFCT_T_NEW == evt_data->type)) || - ((IPPROTO_TCP == l4proto) && - (nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_ESTABLISHED)) - ) - { - p_lan2lan->handle_new_connection(&lan2lan_conn); - } - else if((IPPROTO_UDP == l4proto && NFCT_T_DESTROY == evt_data->type) || - (IPPROTO_TCP == l4proto && - nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_FIN_WAIT)) - { - p_lan2lan->handle_del_connection(&lan2lan_conn); - } - -IGNORE: - /* Cleanup item that was allocated during the original CT callback */ - nfct_destroy(ct); - return; -} -#endif - -void IPACM_ConntrackListener::ProcessCTMessage(void *param) -{ - ipacm_ct_evt_data *evt_data = (ipacm_ct_evt_data *)param; - u_int8_t l4proto = 0; - -#ifdef IPACM_DEBUG - char buf[1024]; - unsigned int out_flags; - - /* Process message and generate ioctl call to kernel thread */ - out_flags = (NFCT_OF_SHOW_LAYER3 | NFCT_OF_TIME | NFCT_OF_ID); - nfct_snprintf(buf, sizeof(buf), evt_data->ct, - evt_data->type, NFCT_O_PLAIN, out_flags); - IPACMDBG_H("%s\n", buf); - - ParseCTMessage(evt_data->ct); -#endif - - l4proto = nfct_get_attr_u8(evt_data->ct, ATTR_ORIG_L4PROTO); - if(IPPROTO_UDP != l4proto && IPPROTO_TCP != l4proto) - { - IPACMDBG("Received unexpected protocl %d conntrack message\n", l4proto); - } - else - { - ProcessTCPorUDPMsg(evt_data->ct, evt_data->type, l4proto); - } - - /* Cleanup item that was allocated during the original CT callback */ - nfct_destroy(evt_data->ct); - return; -} - -bool IPACM_ConntrackListener::AddIface( - nat_table_entry *rule, bool *isTempEntry) -{ - int cnt; - - *isTempEntry = false; - - /* Special handling for Passthrough IP. */ - if (IPACM_Iface::ipacmcfg->ipacm_ip_passthrough_mode) - { - if (rule->private_ip == IPACM_Wan::getWANIP()) - { - IPACMDBG("In Passthrough mode and entry matched with Wan IP (0x%x)\n", - rule->private_ip); - return true; - } - } - - /* check whether nat iface or not */ - for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++) - { - if (nat_iface_ipv4_addr[cnt] != 0) - { - if (rule->private_ip == nat_iface_ipv4_addr[cnt] || - rule->target_ip == nat_iface_ipv4_addr[cnt]) - { - IPACMDBG("matched nat_iface_ipv4_addr entry(%d)\n", cnt); - iptodot("AddIface(): Nat entry match with ip addr", - nat_iface_ipv4_addr[cnt]); - return true; - } - } - } - - if (!isStaMode) - { - /* check whether non nat iface or not, on Non Nat iface - add dummy rule by copying public ip to private ip */ - for (cnt = 0; cnt < MAX_IFACE_ADDRESS; cnt++) - { - if (nonnat_iface_ipv4_addr[cnt] != 0) - { - if (rule->private_ip == nonnat_iface_ipv4_addr[cnt] || - rule->target_ip == nonnat_iface_ipv4_addr[cnt]) - { - IPACMDBG("matched non_nat_iface_ipv4_addr entry(%d)\n", cnt); - iptodot("AddIface(): Non Nat entry match with ip addr", - nonnat_iface_ipv4_addr[cnt]); - - rule->private_ip = rule->public_ip; - rule->private_port = rule->public_port; - return true; - } - } - } - IPACMDBG_H("Not mtaching with non-nat ifaces\n"); - } - else - IPACMDBG("In STA mode, don't compare against non nat ifaces\n"); - - if(pConfig == NULL) - { - pConfig = IPACM_Config::GetInstance(); - if(pConfig == NULL) - { - IPACMERR("Unable to get Config instance\n"); - return false; - } - } - - if (pConfig->isPrivateSubnet(rule->private_ip) || - pConfig->isPrivateSubnet(rule->target_ip)) - { - IPACMDBG("Matching with Private subnet\n"); - *isTempEntry = true; - return true; - } - - return false; -} - -void IPACM_ConntrackListener::AddORDeleteNatEntry(const nat_entry_bundle *input) -{ - u_int8_t tcp_state; - - if (nat_inst == NULL) - { - IPACMERR("Nat instance is NULL, unable to add or delete\n"); - return; - } - - IPACMDBG_H("Below Nat Entry will either be added or deleted\n"); - iptodot("AddORDeleteNatEntry(): target ip or dst ip", - input->rule->target_ip); - IPACMDBG("target port or dst port: 0x%x Decimal:%d\n", - input->rule->target_port, input->rule->target_port); - iptodot("AddORDeleteNatEntry(): private ip or src ip", - input->rule->private_ip); - IPACMDBG("private port or src port: 0x%x, Decimal:%d\n", - input->rule->private_port, input->rule->private_port); - IPACMDBG("public port or reply dst port: 0x%x, Decimal:%d\n", - input->rule->public_port, input->rule->public_port); - IPACMDBG("Protocol: %d, destination nat flag: %d\n", - input->rule->protocol, input->rule->dst_nat); - - if (IPPROTO_TCP == input->rule->protocol) - { - tcp_state = nfct_get_attr_u8(input->ct, ATTR_TCP_STATE); - if (TCP_CONNTRACK_ESTABLISHED == tcp_state) - { - IPACMDBG("TCP state TCP_CONNTRACK_ESTABLISHED(%d)\n", tcp_state); - if (!CtList->isWanUp()) - { - IPACMDBG("Wan is not up, cache connections\n"); - nat_inst->CacheEntry(input->rule); - } - else if (input->isTempEntry) - { - nat_inst->AddTempEntry(input->rule); - } - else - { - nat_inst->AddEntry(input->rule); - } - } - else if (TCP_CONNTRACK_FIN_WAIT == tcp_state || - input->type == NFCT_T_DESTROY) - { - IPACMDBG("TCP state TCP_CONNTRACK_FIN_WAIT(%d) " - "or type NFCT_T_DESTROY(%d)\n", tcp_state, input->type); - - nat_inst->DeleteEntry(input->rule); - nat_inst->DeleteTempEntry(input->rule); - } - else - { - IPACMDBG("Ignore tcp state: %d and type: %d\n", - tcp_state, input->type); - } - - } - else if (IPPROTO_UDP == input->rule->protocol) - { - if (NFCT_T_NEW == input->type) - { - IPACMDBG("New UDP connection at time %ld\n", time(NULL)); - if (!CtList->isWanUp()) - { - IPACMDBG("Wan is not up, cache connections\n"); - nat_inst->CacheEntry(input->rule); - } - else if (input->isTempEntry) - { - nat_inst->AddTempEntry(input->rule); - } - else - { - nat_inst->AddEntry(input->rule); - } - } - else if (NFCT_T_DESTROY == input->type) - { - IPACMDBG("UDP connection close at time %ld\n", time(NULL)); - nat_inst->DeleteEntry(input->rule); - nat_inst->DeleteTempEntry(input->rule); - } - } - - return; -} - -void IPACM_ConntrackListener::PopulateTCPorUDPEntry( - struct nf_conntrack *ct, - uint32_t status, - nat_table_entry *rule) -{ - if (IPS_DST_NAT == status) - { - IPACMDBG("Destination NAT\n"); - rule->dst_nat = true; - - IPACMDBG("Parse reply tuple\n"); - rule->target_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC); - rule->target_ip = ntohl(rule->target_ip); - iptodot("PopulateTCPorUDPEntry(): target ip", rule->target_ip); - - /* Retriev target/dst port */ - rule->target_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC); - rule->target_port = ntohs(rule->target_port); - if (0 == rule->target_port) - { - IPACMDBG("unable to retrieve target port\n"); - } - - rule->public_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); - rule->public_port = ntohs(rule->public_port); - - /* Retriev src/private ip address */ - rule->private_ip = nfct_get_attr_u32(ct, ATTR_REPL_IPV4_SRC); - rule->private_ip = ntohl(rule->private_ip); - iptodot("PopulateTCPorUDPEntry(): private ip", rule->private_ip); - if (0 == rule->private_ip) - { - IPACMDBG("unable to retrieve private ip address\n"); - } - - /* Retriev src/private port */ - rule->private_port = nfct_get_attr_u16(ct, ATTR_REPL_PORT_SRC); - rule->private_port = ntohs(rule->private_port); - if (0 == rule->private_port) - { - IPACMDBG("unable to retrieve private port\n"); - } - } - else if (IPS_SRC_NAT == status) - { - IPACMDBG("Source NAT\n"); - rule->dst_nat = false; - - /* Retriev target/dst ip address */ - IPACMDBG("Parse source tuple\n"); - rule->target_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST); - rule->target_ip = ntohl(rule->target_ip); - iptodot("PopulateTCPorUDPEntry(): target ip", rule->target_ip); - if (0 == rule->target_ip) - { - IPACMDBG("unable to retrieve target ip address\n"); - } - /* Retriev target/dst port */ - rule->target_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_DST); - rule->target_port = ntohs(rule->target_port); - if (0 == rule->target_port) - { - IPACMDBG("unable to retrieve target port\n"); - } - - /* Retriev public port */ - rule->public_port = nfct_get_attr_u16(ct, ATTR_REPL_PORT_DST); - rule->public_port = ntohs(rule->public_port); - if (0 == rule->public_port) - { - IPACMDBG("unable to retrieve public port\n"); - } - - /* Retriev src/private ip address */ - rule->private_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC); - rule->private_ip = ntohl(rule->private_ip); - iptodot("PopulateTCPorUDPEntry(): private ip", rule->private_ip); - if (0 == rule->private_ip) - { - IPACMDBG("unable to retrieve private ip address\n"); - } - - /* Retriev src/private port */ - rule->private_port = nfct_get_attr_u16(ct, ATTR_ORIG_PORT_SRC); - rule->private_port = ntohs(rule->private_port); - if (0 == rule->private_port) - { - IPACMDBG("unable to retrieve private port\n"); - } - } - - return; -} - -#ifdef CT_OPT -void IPACM_ConntrackListener::HandleLan2Lan(struct nf_conntrack *ct, - enum nf_conntrack_msg_type type, - nat_table_entry *rule) -{ - ipacm_event_connection lan2lan_conn = { 0 }; - - if (p_lan2lan == NULL) - { - IPACMERR("Lan2Lan Instance is null\n"); - return; - } - - lan2lan_conn.iptype = IPA_IP_v4; - lan2lan_conn.src_ipv4_addr = orig_src_ip; - lan2lan_conn.dst_ipv4_addr = orig_dst_ip; - - if (((IPPROTO_UDP == rule->protocol) && (NFCT_T_NEW == type)) || - ((IPPROTO_TCP == rule->protocol) && (nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_ESTABLISHED))) - { - p_lan2lan->handle_new_connection(&lan2lan_conn); - } - else if ((IPPROTO_UDP == rule->protocol && NFCT_T_DESTROY == type) || - (IPPROTO_TCP == rule->protocol && - nfct_get_attr_u8(ct, ATTR_TCP_STATE) == TCP_CONNTRACK_FIN_WAIT)) - { - p_lan2lan->handle_del_connection(&lan2lan_conn); - } -} -#endif - -void IPACM_ConntrackListener::CheckSTAClient( - const nat_table_entry *rule, bool *isTempEntry) -{ - int nCnt; - - /* Check whether target is in STA client list or not - if not ignore the connection */ - if(!isStaMode || (StaClntCnt == 0)) - { - return; - } - - if((sta_clnt_ipv4_addr[0] & STA_CLNT_SUBNET_MASK) != - (rule->target_ip & STA_CLNT_SUBNET_MASK)) - { - IPACMDBG("STA client subnet mask not matching\n"); - return; - } - - IPACMDBG("StaClntCnt %d\n", StaClntCnt); - for(nCnt = 0; nCnt < StaClntCnt; nCnt++) - { - IPACMDBG("Comparing trgt_ip 0x%x with sta clnt ip: 0x%x\n", - rule->target_ip, sta_clnt_ipv4_addr[nCnt]); - if(rule->target_ip == sta_clnt_ipv4_addr[nCnt]) - { - IPACMDBG("Match index %d\n", nCnt); - return; - } - } - - IPACMDBG_H("Not matching with STA Clnt Ip Addrs 0x%x\n", - rule->target_ip); - *isTempEntry = true; -} - -/* conntrack send in host order and ipa expects in host order */ -void IPACM_ConntrackListener::ProcessTCPorUDPMsg( - struct nf_conntrack *ct, - enum nf_conntrack_msg_type type, - u_int8_t l4proto) -{ - nat_table_entry rule; - uint32_t status = 0; - uint32_t orig_src_ip, orig_dst_ip; - bool isAdd = false; - - nat_entry_bundle nat_entry; - nat_entry.isTempEntry = false; - nat_entry.ct = ct; - nat_entry.type = type; - - memset(&rule, 0, sizeof(rule)); - IPACMDBG("Received type:%d with proto:%d\n", type, l4proto); - status = nfct_get_attr_u32(ct, ATTR_STATUS); - - /* Retrieve Protocol */ - rule.protocol = nfct_get_attr_u8(ct, ATTR_REPL_L4PROTO); - - if(IPS_DST_NAT & status) - { - status = IPS_DST_NAT; - } - else if(IPS_SRC_NAT & status) - { - status = IPS_SRC_NAT; - } - else - { - IPACMDBG("Neither Destination nor Source nat flag Set\n"); - orig_src_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_SRC); - orig_src_ip = ntohl(orig_src_ip); - if(orig_src_ip == 0) - { - IPACMERR("unable to retrieve orig src ip address\n"); - return; - } - - orig_dst_ip = nfct_get_attr_u32(ct, ATTR_ORIG_IPV4_DST); - orig_dst_ip = ntohl(orig_dst_ip); - if(orig_dst_ip == 0) - { - IPACMERR("unable to retrieve orig dst ip address\n"); - return; - } - - if(orig_src_ip == wan_ipaddr) - { - IPACMDBG("orig src ip:0x%x equal to wan ip\n",orig_src_ip); - status = IPS_SRC_NAT; - } - else if(orig_dst_ip == wan_ipaddr) - { - IPACMDBG("orig Dst IP:0x%x equal to wan ip\n",orig_dst_ip); - status = IPS_DST_NAT; - } - else - { - IPACMDBG_H("Neither orig src ip:0x%x Nor orig Dst IP:0x%x equal to wan ip:0x%x\n", - orig_src_ip, orig_dst_ip, wan_ipaddr); - -#ifdef CT_OPT - HandleLan2Lan(ct, type, &rule); -#endif - return; - } - } - - if(IPS_DST_NAT == status || IPS_SRC_NAT == status) - { - PopulateTCPorUDPEntry(ct, status, &rule); - rule.public_ip = wan_ipaddr; - } - else - { - IPACMDBG("Neither source Nor destination nat\n"); - goto IGNORE; - } - - if (rule.private_ip != wan_ipaddr) - { - isAdd = AddIface(&rule, &nat_entry.isTempEntry); - if (!isAdd) - { - goto IGNORE; - } - } - else - { - if (isStaMode) - { - IPACMDBG("In STA mode, ignore connections destinated to STA interface\n"); - goto IGNORE; - } - - IPACMDBG("For embedded connections add dummy nat rule\n"); - IPACMDBG("Change private port %d to %d\n", - rule.private_port, rule.public_port); - rule.private_port = rule.public_port; - } - - CheckSTAClient(&rule, &nat_entry.isTempEntry); - nat_entry.rule = &rule; - AddORDeleteNatEntry(&nat_entry); - return; - -IGNORE: - IPACMDBG_H("ignoring below Nat Entry\n"); - iptodot("ProcessTCPorUDPMsg(): target ip or dst ip", rule.target_ip); - IPACMDBG("target port or dst port: 0x%x Decimal:%d\n", rule.target_port, rule.target_port); - iptodot("ProcessTCPorUDPMsg(): private ip or src ip", rule.private_ip); - IPACMDBG("private port or src port: 0x%x, Decimal:%d\n", rule.private_port, rule.private_port); - IPACMDBG("public port or reply dst port: 0x%x, Decimal:%d\n", rule.public_port, rule.public_port); - IPACMDBG("Protocol: %d, destination nat flag: %d\n", rule.protocol, rule.dst_nat); - return; -} - -void IPACM_ConntrackListener::HandleSTAClientAddEvt(uint32_t clnt_ip_addr) -{ - int cnt; - IPACMDBG_H("Received STA client 0x%x\n", clnt_ip_addr); - - if(StaClntCnt >= MAX_STA_CLNT_IFACES) - { - IPACMDBG("Max STA client reached, ignore 0x%x\n", clnt_ip_addr); - return; - } - - for(cnt=0; cnt<MAX_STA_CLNT_IFACES; cnt++) - { - if(sta_clnt_ipv4_addr[cnt] != 0 && - sta_clnt_ipv4_addr[cnt] == clnt_ip_addr) - { - IPACMDBG("Ignoring duplicate one 0x%x\n", clnt_ip_addr); - break; - } - - if(sta_clnt_ipv4_addr[cnt] == 0) - { - IPACMDBG("Adding STA client 0x%x at Index: %d\n", - clnt_ip_addr, cnt); - sta_clnt_ipv4_addr[cnt] = clnt_ip_addr; - StaClntCnt++; - IPACMDBG("STA client cnt %d\n", StaClntCnt); - break; - } - - } - - nat_inst->FlushTempEntries(clnt_ip_addr, true); - return; -} - -void IPACM_ConntrackListener::HandleSTAClientDelEvt(uint32_t clnt_ip_addr) -{ - int cnt; - IPACMDBG_H("Received STA client 0x%x\n", clnt_ip_addr); - - for(cnt=0; cnt<MAX_STA_CLNT_IFACES; cnt++) - { - if(sta_clnt_ipv4_addr[cnt] != 0 && - sta_clnt_ipv4_addr[cnt] == clnt_ip_addr) - { - IPACMDBG("Deleting STA client 0x%x at index: %d\n", - clnt_ip_addr, cnt); - sta_clnt_ipv4_addr[cnt] = 0; - nat_inst->DelEntriesOnSTAClntDiscon(clnt_ip_addr); - StaClntCnt--; - IPACMDBG("STA client cnt %d\n", StaClntCnt); - break; - } - } - - nat_inst->FlushTempEntries(clnt_ip_addr, false); - return; -} diff --git a/ipacm/src/IPACM_Conntrack_NATApp.cpp b/ipacm/src/IPACM_Conntrack_NATApp.cpp deleted file mode 100644 index f0bdd99..0000000 --- a/ipacm/src/IPACM_Conntrack_NATApp.cpp +++ /dev/null @@ -1,969 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#include "IPACM_Conntrack_NATApp.h" -#include "IPACM_ConntrackClient.h" - -#define INVALID_IP_ADDR 0x0 - -/* NatApp class Implementation */ -NatApp *NatApp::pInstance = NULL; -NatApp::NatApp() -{ - max_entries = 0; - cache = NULL; - - nat_table_hdl = 0; - pub_ip_addr = 0; - - curCnt = 0; - - pALGPorts = NULL; - nALGPort = 0; - - ct = NULL; - ct_hdl = NULL; - - memset(temp, 0, sizeof(temp)); -} - -int NatApp::Init(void) -{ - IPACM_Config *pConfig; - int size = 0; - - pConfig = IPACM_Config::GetInstance(); - if(pConfig == NULL) - { - IPACMERR("Unable to get Config instance\n"); - return -1; - } - - max_entries = pConfig->GetNatMaxEntries(); - - size = (sizeof(nat_table_entry) * max_entries); - cache = (nat_table_entry *)malloc(size); - if(cache == NULL) - { - IPACMERR("Unable to allocate memory for cache\n"); - goto fail; - } - IPACMDBG("Allocated %d bytes for config manager nat cache\n", size); - memset(cache, 0, size); - - nALGPort = pConfig->GetAlgPortCnt(); - if(nALGPort > 0) - { - pALGPorts = (ipacm_alg *)malloc(sizeof(ipacm_alg) * nALGPort); - if(pALGPorts == NULL) - { - IPACMERR("Unable to allocate memory for alg prots\n"); - goto fail; - } - memset(pALGPorts, 0, sizeof(ipacm_alg) * nALGPort); - - if(pConfig->GetAlgPorts(nALGPort, pALGPorts) != 0) - { - IPACMERR("Unable to retrieve ALG prots\n"); - goto fail; - } - - IPACMDBG("Printing %d alg ports information\n", nALGPort); - for(int cnt=0; cnt<nALGPort; cnt++) - { - IPACMDBG("%d: Proto[%d], port[%d]\n", cnt, pALGPorts[cnt].protocol, pALGPorts[cnt].port); - } - } - - return 0; - -fail: - free(cache); - free(pALGPorts); - return -1; -} - -NatApp* NatApp::GetInstance() -{ - if(pInstance == NULL) - { - pInstance = new NatApp(); - - if(pInstance->Init()) - { - delete pInstance; - return NULL; - } - } - - return pInstance; -} - -/* NAT APP related object function definitions */ - -int NatApp::AddTable(uint32_t pub_ip) -{ - int ret; - int cnt = 0; - ipa_nat_ipv4_rule nat_rule; - IPACMDBG_H("%s() %d\n", __FUNCTION__, __LINE__); - - /* Not reset the cache wait it timeout by destroy event */ -#if 0 - if (pub_ip != pub_ip_addr_pre) - { - IPACMDBG("Reset the cache because NAT-ipv4 different\n"); - memset(cache, 0, sizeof(nat_table_entry) * max_entries); - curCnt = 0; - } -#endif - ret = ipa_nat_add_ipv4_tbl(pub_ip, max_entries, &nat_table_hdl); - if(ret) - { - IPACMERR("unable to create nat table Error:%d\n", ret); - return ret; - } - - /* Add back the cached NAT-entry */ - if (pub_ip == pub_ip_addr_pre) - { - IPACMDBG("Restore the cache to ipa NAT-table\n"); - for(cnt = 0; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip !=0) - { - memset(&nat_rule, 0 , sizeof(nat_rule)); - nat_rule.private_ip = cache[cnt].private_ip; - nat_rule.target_ip = cache[cnt].target_ip; - nat_rule.target_port = cache[cnt].target_port; - nat_rule.private_port = cache[cnt].private_port; - nat_rule.public_port = cache[cnt].public_port; - nat_rule.protocol = cache[cnt].protocol; - - if(ipa_nat_add_ipv4_rule(nat_table_hdl, &nat_rule, &cache[cnt].rule_hdl) < 0) - { - IPACMERR("unable to add the rule delete from cache\n"); - memset(&cache[cnt], 0, sizeof(cache[cnt])); - curCnt--; - continue; - } - cache[cnt].enabled = true; - - IPACMDBG("On wan-iface reset added below rule successfully\n"); - iptodot("Private IP", nat_rule.private_ip); - iptodot("Target IP", nat_rule.target_ip); - IPACMDBG("Private Port:%d \t Target Port: %d\t", nat_rule.private_port, nat_rule.target_port); - IPACMDBG("Public Port:%d\n", nat_rule.public_port); - IPACMDBG("protocol: %d\n", nat_rule.protocol); - } - } - } - - pub_ip_addr = pub_ip; - return 0; -} - -void NatApp::Reset() -{ - int cnt = 0; - - nat_table_hdl = 0; - pub_ip_addr = 0; - /* NAT tbl deleted, reset enabled bit */ - for(cnt = 0; cnt < max_entries; cnt++) - { - cache[cnt].enabled = false; - } -} - -int NatApp::DeleteTable(uint32_t pub_ip) -{ - int ret; - IPACMDBG_H("%s() %d\n", __FUNCTION__, __LINE__); - - CHK_TBL_HDL(); - - if(pub_ip_addr != pub_ip) - { - IPACMDBG("Public ip address is not matching\n"); - IPACMERR("unable to delete the nat table\n"); - return -1; - } - - ret = ipa_nat_del_ipv4_tbl(nat_table_hdl); - if(ret) - { - IPACMERR("unable to delete nat table Error: %d\n", ret);; - return ret; - } - - pub_ip_addr_pre = pub_ip_addr; - Reset(); - return 0; -} - -/* Check for duplicate entries */ -bool NatApp::ChkForDup(const nat_table_entry *rule) -{ - int cnt = 0; - IPACMDBG("%s() %d\n", __FUNCTION__, __LINE__); - - for(; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip == rule->private_ip && - cache[cnt].target_ip == rule->target_ip && - cache[cnt].private_port == rule->private_port && - cache[cnt].target_port == rule->target_port && - cache[cnt].protocol == rule->protocol) - { - log_nat(rule->protocol,rule->private_ip,rule->target_ip,rule->private_port,\ - rule->target_port,"Duplicate Rule\n"); - return true; - } - } - - return false; -} - -/* Delete the entry from Nat table on connection close */ -int NatApp::DeleteEntry(const nat_table_entry *rule) -{ - int cnt = 0; - IPACMDBG("%s() %d\n", __FUNCTION__, __LINE__); - - log_nat(rule->protocol,rule->private_ip,rule->target_ip,rule->private_port,\ - rule->target_port,"for deletion\n"); - - - for(; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip == rule->private_ip && - cache[cnt].target_ip == rule->target_ip && - cache[cnt].private_port == rule->private_port && - cache[cnt].target_port == rule->target_port && - cache[cnt].protocol == rule->protocol) - { - - if(cache[cnt].enabled == true) - { - if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0) - { - IPACMERR("%s() %d deletion failed\n", __FUNCTION__, __LINE__); - } - - IPACMDBG_H("Deleted Nat entry(%d) Successfully\n", cnt); - } - else - { - IPACMDBG_H("Deleted Nat entry(%d) only from cache\n", cnt); - } - - memset(&cache[cnt], 0, sizeof(cache[cnt])); - curCnt--; - break; - } - } - - return 0; -} - -/* Add new entry to the nat table on new connection */ -int NatApp::AddEntry(const nat_table_entry *rule) -{ - int cnt = 0; - ipa_nat_ipv4_rule nat_rule; - - IPACMDBG("%s() %d\n", __FUNCTION__, __LINE__); - - CHK_TBL_HDL(); - log_nat(rule->protocol,rule->private_ip,rule->target_ip,rule->private_port,\ - rule->target_port,"for addition\n"); - if(isAlgPort(rule->protocol, rule->private_port) || - isAlgPort(rule->protocol, rule->target_port)) - { - IPACMERR("connection using ALG Port, ignore\n"); - return -1; - } - - if(rule->private_ip == 0 || - rule->target_ip == 0 || - rule->private_port == 0 || - rule->target_port == 0 || - rule->protocol == 0) - { - IPACMERR("Invalid Connection, ignoring it\n"); - return 0; - } - - if(!ChkForDup(rule)) - { - for(; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip == 0 && - cache[cnt].target_ip == 0 && - cache[cnt].private_port == 0 && - cache[cnt].target_port == 0 && - cache[cnt].protocol == 0) - { - break; - } - } - - if(max_entries == cnt) - { - IPACMERR("Error: Unable to add, reached maximum rules\n"); - return -1; - } - else - { - nat_rule.private_ip = rule->private_ip; - nat_rule.target_ip = rule->target_ip; - nat_rule.target_port = rule->target_port; - nat_rule.private_port = rule->private_port; - nat_rule.public_port = rule->public_port; - nat_rule.protocol = rule->protocol; - - if(isPwrSaveIf(rule->private_ip) || - isPwrSaveIf(rule->target_ip)) - { - IPACMDBG("Device is Power Save mode: Dont insert into nat table but cache\n"); - cache[cnt].enabled = false; - cache[cnt].rule_hdl = 0; - } - else - { - - if(ipa_nat_add_ipv4_rule(nat_table_hdl, &nat_rule, &cache[cnt].rule_hdl) < 0) - { - IPACMERR("unable to add the rule\n"); - return -1; - } - - cache[cnt].enabled = true; - } - - cache[cnt].private_ip = rule->private_ip; - cache[cnt].target_ip = rule->target_ip; - cache[cnt].target_port = rule->target_port; - cache[cnt].private_port = rule->private_port; - cache[cnt].protocol = rule->protocol; - cache[cnt].timestamp = 0; - cache[cnt].public_port = rule->public_port; - cache[cnt].dst_nat = rule->dst_nat; - curCnt++; - } - - } - else - { - IPACMERR("Duplicate rule. Ignore it\n"); - return -1; - } - - if(cache[cnt].enabled == true) - { - IPACMDBG_H("Added rule(%d) successfully\n", cnt); - } - else - { - IPACMDBG_H("Cached rule(%d) successfully\n", cnt); - } - - return 0; -} - -void NatApp::UpdateCTUdpTs(nat_table_entry *rule, uint32_t new_ts) -{ - int ret; - - iptodot("Private IP:", rule->private_ip); - iptodot("Target IP:", rule->target_ip); - IPACMDBG("Private Port: %d, Target Port: %d\n", rule->private_port, rule->target_port); - - if(!ct_hdl) - { - ct_hdl = nfct_open(CONNTRACK, 0); - if(!ct_hdl) - { - PERROR("nfct_open"); - return; - } - } - - if(!ct) - { - ct = nfct_new(); - if(!ct) - { - PERROR("nfct_new"); - return; - } - } - - nfct_set_attr_u8(ct, ATTR_L3PROTO, AF_INET); - if(rule->protocol == IPPROTO_UDP) - { - nfct_set_attr_u8(ct, ATTR_L4PROTO, rule->protocol); - nfct_set_attr_u32(ct, ATTR_TIMEOUT, udp_timeout); - } - else - { - nfct_set_attr_u8(ct, ATTR_L4PROTO, rule->protocol); - nfct_set_attr_u32(ct, ATTR_TIMEOUT, tcp_timeout); - } - - if(rule->dst_nat == false) - { - nfct_set_attr_u32(ct, ATTR_IPV4_SRC, htonl(rule->private_ip)); - nfct_set_attr_u16(ct, ATTR_PORT_SRC, htons(rule->private_port)); - - nfct_set_attr_u32(ct, ATTR_IPV4_DST, htonl(rule->target_ip)); - nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(rule->target_port)); - - IPACMDBG("dst nat is not set\n"); - } - else - { - nfct_set_attr_u32(ct, ATTR_IPV4_SRC, htonl(rule->target_ip)); - nfct_set_attr_u16(ct, ATTR_PORT_SRC, htons(rule->target_port)); - - nfct_set_attr_u32(ct, ATTR_IPV4_DST, htonl(pub_ip_addr)); - nfct_set_attr_u16(ct, ATTR_PORT_DST, htons(rule->public_port)); - - IPACMDBG("dst nat is set\n"); - } - - iptodot("Source IP:", nfct_get_attr_u32(ct, ATTR_IPV4_SRC)); - iptodot("Destination IP:", nfct_get_attr_u32(ct, ATTR_IPV4_DST)); - IPACMDBG("Source Port: %d, Destination Port: %d\n", - nfct_get_attr_u16(ct, ATTR_PORT_SRC), nfct_get_attr_u16(ct, ATTR_PORT_DST)); - - IPACMDBG("updating %d connection with time: %d\n", - rule->protocol, nfct_get_attr_u32(ct, ATTR_TIMEOUT)); - - ret = nfct_query(ct_hdl, NFCT_Q_UPDATE, ct); - if(ret == -1) - { - IPACMERR("unable to update time stamp"); - DeleteEntry(rule); - } - else - { - rule->timestamp = new_ts; - IPACMDBG("Updated time stamp successfully\n"); - } - - return; -} - -void NatApp::UpdateUDPTimeStamp() -{ - int cnt; - uint32_t ts; - bool read_to = false; - - for(cnt = 0; cnt < max_entries; cnt++) - { - ts = 0; - if(cache[cnt].enabled == true && - (cache[cnt].private_ip != cache[cnt].public_ip)) - { - IPACMDBG("\n"); - if(ipa_nat_query_timestamp(nat_table_hdl, cache[cnt].rule_hdl, &ts) < 0) - { - IPACMERR("unable to retrieve timeout for rule hanle: %d\n", cache[cnt].rule_hdl); - continue; - } - - if(cache[cnt].timestamp == ts) - { - IPACMDBG("No Change in Time Stamp: cahce:%d, ipahw:%d\n", - cache[cnt].timestamp, ts); - continue; - } - - if (read_to == false) { - read_to = true; - Read_TcpUdp_Timeout(); - } - - UpdateCTUdpTs(&cache[cnt], ts); - } /* end of outer if */ - - } /* end of for loop */ - -} - -bool NatApp::isAlgPort(uint8_t proto, uint16_t port) -{ - int cnt; - for(cnt = 0; cnt < nALGPort; cnt++) - { - if(proto == pALGPorts[cnt].protocol && - port == pALGPorts[cnt].port) - { - return true; - } - } - - return false; -} - -bool NatApp::isPwrSaveIf(uint32_t ip_addr) -{ - int cnt; - - for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++) - { - if(0 != PwrSaveIfs[cnt] && - ip_addr == PwrSaveIfs[cnt]) - { - return true; - } - } - - return false; -} - -int NatApp::UpdatePwrSaveIf(uint32_t client_lan_ip) -{ - int cnt; - IPACMDBG_H("Received IP address: 0x%x\n", client_lan_ip); - - if(client_lan_ip == INVALID_IP_ADDR) - { - IPACMERR("Invalid ip address received\n"); - return -1; - } - - /* check for duplicate events */ - for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++) - { - if(PwrSaveIfs[cnt] == client_lan_ip) - { - IPACMDBG("The client 0x%x is already in power save\n", client_lan_ip); - return 0; - } - } - - for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++) - { - if(PwrSaveIfs[cnt] == 0) - { - PwrSaveIfs[cnt] = client_lan_ip; - break; - } - } - - for(cnt = 0; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip == client_lan_ip && - cache[cnt].enabled == true) - { - if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0) - { - IPACMERR("unable to delete the rule\n"); - continue; - } - - cache[cnt].enabled = false; - cache[cnt].rule_hdl = 0; - } - } - - return 0; -} - -int NatApp::ResetPwrSaveIf(uint32_t client_lan_ip) -{ - int cnt; - ipa_nat_ipv4_rule nat_rule; - - IPACMDBG_H("Received ip address: 0x%x\n", client_lan_ip); - - if(client_lan_ip == INVALID_IP_ADDR) - { - IPACMERR("Invalid ip address received\n"); - return -1; - } - - for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++) - { - if(PwrSaveIfs[cnt] == client_lan_ip) - { - PwrSaveIfs[cnt] = 0; - break; - } - } - - for(cnt = 0; cnt < max_entries; cnt++) - { - IPACMDBG("cache (%d): enable %d, ip 0x%x\n", cnt, cache[cnt].enabled, cache[cnt].private_ip); - - if(cache[cnt].private_ip == client_lan_ip && - cache[cnt].enabled == false) - { - memset(&nat_rule, 0 , sizeof(nat_rule)); - nat_rule.private_ip = cache[cnt].private_ip; - nat_rule.target_ip = cache[cnt].target_ip; - nat_rule.target_port = cache[cnt].target_port; - nat_rule.private_port = cache[cnt].private_port; - nat_rule.public_port = cache[cnt].public_port; - nat_rule.protocol = cache[cnt].protocol; - - if(ipa_nat_add_ipv4_rule(nat_table_hdl, &nat_rule, &cache[cnt].rule_hdl) < 0) - { - IPACMERR("unable to add the rule delete from cache\n"); - memset(&cache[cnt], 0, sizeof(cache[cnt])); - curCnt--; - continue; - } - cache[cnt].enabled = true; - - IPACMDBG("On power reset added below rule successfully\n"); - iptodot("Private IP", nat_rule.private_ip); - iptodot("Target IP", nat_rule.target_ip); - IPACMDBG("Private Port:%d \t Target Port: %d\t", nat_rule.private_port, nat_rule.target_port); - IPACMDBG("Public Port:%d\n", nat_rule.public_port); - IPACMDBG("protocol: %d\n", nat_rule.protocol); - - } - } - - return -1; -} - -uint32_t NatApp::GetTableHdl(uint32_t in_ip_addr) -{ - if(in_ip_addr == pub_ip_addr) - { - return nat_table_hdl; - } - - return -1; -} - -void NatApp::AddTempEntry(const nat_table_entry *new_entry) -{ - int cnt; - - IPACMDBG("Received below Temp Nat entry\n"); - iptodot("Private IP", new_entry->private_ip); - iptodot("Target IP", new_entry->target_ip); - IPACMDBG("Private Port: %d\t Target Port: %d\t", new_entry->private_port, new_entry->target_port); - IPACMDBG("protocolcol: %d\n", new_entry->protocol); - - if(isAlgPort(new_entry->protocol, new_entry->private_port) || - isAlgPort(new_entry->protocol, new_entry->target_port)) - { - IPACMDBG("connection using ALG Port. Dont insert into nat cache\n"); - return; - } - - if(ChkForDup(new_entry)) - { - return; - } - - for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++) - { - if(temp[cnt].private_ip == new_entry->private_ip && - temp[cnt].target_ip == new_entry->target_ip && - temp[cnt].private_port == new_entry->private_port && - temp[cnt].target_port == new_entry->target_port && - temp[cnt].protocol == new_entry->protocol) - { - IPACMDBG("Received duplicate Temp entry\n"); - return; - } - } - - for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++) - { - if(temp[cnt].private_ip == 0 && - temp[cnt].target_ip == 0) - { - memcpy(&temp[cnt], new_entry, sizeof(nat_table_entry)); - IPACMDBG("Added Temp Entry\n"); - return; - } - } - - IPACMDBG("Unable to add temp entry, cache full\n"); - return; -} - -void NatApp::DeleteTempEntry(const nat_table_entry *entry) -{ - int cnt; - - IPACMDBG("Received below nat entry\n"); - iptodot("Private IP", entry->private_ip); - iptodot("Target IP", entry->target_ip); - IPACMDBG("Private Port: %d\t Target Port: %d\n", entry->private_port, entry->target_port); - IPACMDBG("protocol: %d\n", entry->protocol); - - for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++) - { - if(temp[cnt].private_ip == entry->private_ip && - temp[cnt].target_ip == entry->target_ip && - temp[cnt].private_port == entry->private_port && - temp[cnt].target_port == entry->target_port && - temp[cnt].protocol == entry->protocol) - { - memset(&temp[cnt], 0, sizeof(nat_table_entry)); - IPACMDBG("Delete Temp Entry\n"); - return; - } - } - - IPACMDBG("No Such Temp Entry exists\n"); - return; -} - -void NatApp::FlushTempEntries(uint32_t ip_addr, bool isAdd, - bool isDummy) -{ - int cnt; - int ret; - - IPACMDBG_H("Received below with isAdd:%d ", isAdd); - iptodot("IP Address: ", ip_addr); - - for(cnt=0; cnt<MAX_TEMP_ENTRIES; cnt++) - { - if(temp[cnt].private_ip == ip_addr || - temp[cnt].target_ip == ip_addr) - { - if(isAdd) - { - if(temp[cnt].public_ip == pub_ip_addr) - { - if (isDummy) { - /* To avoild DL expections for non IPA path */ - temp[cnt].private_ip = temp[cnt].public_ip; - temp[cnt].private_port = temp[cnt].public_port; - IPACMDBG("Flushing dummy temp rule"); - iptodot("Private IP", temp[cnt].private_ip); - } - - ret = AddEntry(&temp[cnt]); - if(ret) - { - IPACMERR("unable to add temp entry: %d\n", ret); - continue; - } - } - } - memset(&temp[cnt], 0, sizeof(nat_table_entry)); - } - } - - return; -} - -int NatApp::DelEntriesOnClntDiscon(uint32_t ip_addr) -{ - int cnt, tmp = 0; - IPACMDBG_H("Received IP address: 0x%x\n", ip_addr); - - if(ip_addr == INVALID_IP_ADDR) - { - IPACMERR("Invalid ip address received\n"); - return -1; - } - - for(cnt = 0; cnt < IPA_MAX_NUM_WIFI_CLIENTS; cnt++) - { - if(PwrSaveIfs[cnt] == ip_addr) - { - PwrSaveIfs[cnt] = 0; - IPACMDBG("Remove %d power save entry\n", cnt); - break; - } - } - - for(cnt = 0; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip == ip_addr) - { - if(cache[cnt].enabled == true) - { - if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0) - { - IPACMERR("unable to delete the rule\n"); - continue; - } - else - { - IPACMDBG("won't delete the rule\n"); - cache[cnt].enabled = false; - tmp++; - } - } - IPACMDBG("won't delete the rule for entry %d, enabled %d\n",cnt, cache[cnt].enabled); - } - } - - IPACMDBG("Deleted (but cached) %d entries\n", tmp); - return 0; -} - -int NatApp::DelEntriesOnSTAClntDiscon(uint32_t ip_addr) -{ - int cnt, tmp = curCnt; - IPACMDBG_H("Received IP address: 0x%x\n", ip_addr); - - if(ip_addr == INVALID_IP_ADDR) - { - IPACMERR("Invalid ip address received\n"); - return -1; - } - - - for(cnt = 0; cnt < max_entries; cnt++) - { - if(cache[cnt].target_ip == ip_addr) - { - if(cache[cnt].enabled == true) - { - if(ipa_nat_del_ipv4_rule(nat_table_hdl, cache[cnt].rule_hdl) < 0) - { - IPACMERR("unable to delete the rule\n"); - continue; - } - } - - memset(&cache[cnt], 0, sizeof(cache[cnt])); - curCnt--; - } - } - - IPACMDBG("Deleted %d entries\n", (tmp - curCnt)); - return 0; -} - -void NatApp::CacheEntry(const nat_table_entry *rule) -{ - int cnt; - - if(rule->private_ip == 0 || - rule->target_ip == 0 || - rule->private_port == 0 || - rule->target_port == 0 || - rule->protocol == 0) - { - IPACMERR("Invalid Connection, ignoring it\n"); - return; - } - - if(!ChkForDup(rule)) - { - for(cnt=0; cnt < max_entries; cnt++) - { - if(cache[cnt].private_ip == 0 && - cache[cnt].target_ip == 0 && - cache[cnt].private_port == 0 && - cache[cnt].target_port == 0 && - cache[cnt].protocol == 0) - { - break; - } - } - - if(max_entries == cnt) - { - IPACMERR("Error: Unable to add, reached maximum rules\n"); - return; - } - else - { - cache[cnt].enabled = false; - cache[cnt].rule_hdl = 0; - cache[cnt].private_ip = rule->private_ip; - cache[cnt].target_ip = rule->target_ip; - cache[cnt].target_port = rule->target_port; - cache[cnt].private_port = rule->private_port; - cache[cnt].protocol = rule->protocol; - cache[cnt].timestamp = 0; - cache[cnt].public_port = rule->public_port; - cache[cnt].public_ip = rule->public_ip; - cache[cnt].dst_nat = rule->dst_nat; - curCnt++; - } - - } - else - { - IPACMERR("Duplicate rule. Ignore it\n"); - return; - } - - IPACMDBG("Cached rule(%d) successfully\n", cnt); - return; -} - -void NatApp::Read_TcpUdp_Timeout(void) { - FILE *udp_fd = NULL, *tcp_fd = NULL; - - /* Read UDP timeout value */ - udp_fd = fopen(IPACM_UDP_FULL_FILE_NAME, "r"); - if (udp_fd == NULL) { - IPACMERR("unable to open %s\n", IPACM_UDP_FULL_FILE_NAME); - goto fail; - } - - if (fscanf(udp_fd, "%d", &udp_timeout) != 1) { - IPACMERR("Error reading udp timeout\n"); - } - IPACMDBG_H("udp timeout value: %d\n", udp_timeout); - - - /* Read TCP timeout value */ - tcp_fd = fopen(IPACM_TCP_FULL_FILE_NAME, "r"); - if (tcp_fd == NULL) { - IPACMERR("unable to open %s\n", IPACM_TCP_FULL_FILE_NAME); - goto fail; - } - - - if (fscanf(tcp_fd, "%d", &tcp_timeout) != 1) { - IPACMERR("Error reading tcp timeout\n"); - } - IPACMDBG_H("tcp timeout value: %d\n", tcp_timeout); - -fail: - if (udp_fd) { - fclose(udp_fd); - } - if (tcp_fd) { - fclose(tcp_fd); - } - - return; -} diff --git a/ipacm/src/IPACM_EvtDispatcher.cpp b/ipacm/src/IPACM_EvtDispatcher.cpp deleted file mode 100644 index edb5901..0000000 --- a/ipacm/src/IPACM_EvtDispatcher.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_EvtDispatcher.cpp - - @brief - This file implements the IPAM event dispatcher functionality - - @Author - -*/ -#include <string.h> -#include <pthread.h> -#include <IPACM_EvtDispatcher.h> -#include <IPACM_Neighbor.h> -#include "IPACM_CmdQueue.h" -#include "IPACM_Defs.h" - - -extern pthread_mutex_t mutex; -extern pthread_cond_t cond_var; - -cmd_evts *IPACM_EvtDispatcher::head = NULL; -extern uint32_t ipacm_event_stats[IPACM_EVENT_MAX]; - -int IPACM_EvtDispatcher::PostEvt -( - ipacm_cmd_q_data *data -) -{ - Message *item = NULL; - MessageQueue *MsgQueue = NULL; - - if(data->event < IPA_EXTERNAL_EVENT_MAX) - { - IPACMDBG("Insert event into external queue.\n"); - MsgQueue = MessageQueue::getInstanceExternal(); - } - else - { - IPACMDBG("Insert event into internal queue.\n"); - MsgQueue = MessageQueue::getInstanceInternal(); - } - if(MsgQueue == NULL) - { - IPACMERR("unable to retrieve MsgQueue instance\n"); - return IPACM_FAILURE; - } - - item = new Message(); - if(item == NULL) - { - IPACMERR("unable to create new message item\n"); - return IPACM_FAILURE; - } - - item->evt.callback_ptr = IPACM_EvtDispatcher::ProcessEvt; - memcpy(&item->evt.data, data, sizeof(ipacm_cmd_q_data)); - - if(pthread_mutex_lock(&mutex) != 0) - { - IPACMERR("unable to lock the mutex\n"); - return IPACM_FAILURE; - } - - IPACMDBG("Enqueing item\n"); - MsgQueue->enqueue(item); - IPACMDBG("Enqueued item %p\n", item); - - if(pthread_cond_signal(&cond_var) != 0) - { - IPACMDBG("unable to lock the mutex\n"); - /* Release the mutex before you return failure */ - if(pthread_mutex_unlock(&mutex) != 0) - { - IPACMERR("unable to unlock the mutex\n"); - return IPACM_FAILURE; - } - return IPACM_FAILURE; - } - - if(pthread_mutex_unlock(&mutex) != 0) - { - IPACMERR("unable to unlock the mutex\n"); - return IPACM_FAILURE; - } - - return IPACM_SUCCESS; -} - -void IPACM_EvtDispatcher::ProcessEvt(ipacm_cmd_q_data *data) -{ - - cmd_evts *tmp = head, tmp1; - - if(head == NULL) - { - IPACMDBG("Queue is empty\n"); - } - - while(tmp != NULL) - { - memcpy(&tmp1, tmp, sizeof(tmp1)); - if(data->event == tmp1.event) - { - ipacm_event_stats[data->event]++; - tmp1.obj->event_callback(data->event, data->evt_data); - IPACMDBG(" Find matched registered events\n"); - } - tmp = tmp1.next; - } - - IPACMDBG(" Finished process events\n"); - - if(data->evt_data != NULL) - { - IPACMDBG("free the event:%d data: %p\n", data->event, data->evt_data); - free(data->evt_data); - } - return; -} - -int IPACM_EvtDispatcher::registr(ipa_cm_event_id event, IPACM_Listener *obj) -{ - cmd_evts *tmp = head,*nw; - - nw = (cmd_evts *)malloc(sizeof(cmd_evts)); - if(nw != NULL) - { - nw->event = event; - nw->obj = obj; - nw->next = NULL; - } - else - { - return IPACM_FAILURE; - } - - if(head == NULL) - { - head = nw; - } - else - { - while(tmp->next) - { - tmp = tmp->next; - } - tmp->next = nw; - } - return IPACM_SUCCESS; -} - - -int IPACM_EvtDispatcher::deregistr(IPACM_Listener *param) -{ - cmd_evts *tmp = head,*tmp1,*prev = head; - - while(tmp != NULL) - { - if(tmp->obj == param) - { - tmp1 = tmp; - if(tmp == head) - { - head = head->next; - } - else if(tmp->next == NULL) - { - prev->next = NULL; - } - else - { - prev->next = tmp->next; - } - - tmp = tmp->next; - free(tmp1); - } - else - { - prev = tmp; - tmp = tmp->next; - } - } - return IPACM_SUCCESS; -} diff --git a/ipacm/src/IPACM_Filtering.cpp b/ipacm/src/IPACM_Filtering.cpp deleted file mode 100644 index 22eb19c..0000000 --- a/ipacm/src/IPACM_Filtering.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Filtering.cpp - - @brief - This file implements the IPACM filtering functionality. - - @Author - Skylar Chang - -*/ -#include <unistd.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> - -#include "IPACM_Filtering.h" -#include <IPACM_Log.h> -#include "IPACM_Defs.h" - - -const char *IPACM_Filtering::DEVICE_NAME = "/dev/ipa"; - -IPACM_Filtering::IPACM_Filtering() -{ - fd = open(DEVICE_NAME, O_RDWR); - if (fd < 0) - { - IPACMERR("Failed opening %s.\n", DEVICE_NAME); - } -} - -IPACM_Filtering::~IPACM_Filtering() -{ - close(fd); -} - -bool IPACM_Filtering::DeviceNodeIsOpened() -{ - return fd; -} - -bool IPACM_Filtering::AddFilteringRule(struct ipa_ioc_add_flt_rule const *ruleTable) -{ - int retval = 0; - - IPACMDBG("Printing filter add attributes\n"); - IPACMDBG("ip type: %d\n", ruleTable->ip); - IPACMDBG("Number of rules: %d\n", ruleTable->num_rules); - IPACMDBG("End point: %d and global value: %d\n", ruleTable->ep, ruleTable->global); - IPACMDBG("commit value: %d\n", ruleTable->commit); - for (int cnt=0; cnt<ruleTable->num_rules; cnt++) - { - IPACMDBG("Filter rule:%d attrib mask: 0x%x\n", cnt, - ruleTable->rules[cnt].rule.attrib.attrib_mask); - } - - retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE, ruleTable); - if (retval != 0) - { - IPACMERR("Failed adding Filtering rule %p\n", ruleTable); - PERROR("unable to add filter rule:"); - - for (int cnt = 0; cnt < ruleTable->num_rules; cnt++) - { - if (ruleTable->rules[cnt].status != 0) - { - IPACMERR("Adding Filter rule:%d failed with status:%d\n", - cnt, ruleTable->rules[cnt].status); - } - } - return false; - } - - for (int cnt = 0; cnt<ruleTable->num_rules; cnt++) - { - if(ruleTable->rules[cnt].status != 0) - { - IPACMERR("Adding Filter rule:%d failed with status:%d\n", - cnt, ruleTable->rules[cnt].status); - } - } - - IPACMDBG("Added Filtering rule %p\n", ruleTable); - return true; -} - -bool IPACM_Filtering::AddFilteringRuleAfter(struct ipa_ioc_add_flt_rule_after const *ruleTable) -{ -#ifdef FEATURE_IPA_V3 - int retval = 0; - - IPACMDBG("Printing filter add attributes\n"); - IPACMDBG("ip type: %d\n", ruleTable->ip); - IPACMDBG("Number of rules: %d\n", ruleTable->num_rules); - IPACMDBG("End point: %d\n", ruleTable->ep); - IPACMDBG("commit value: %d\n", ruleTable->commit); - - retval = ioctl(fd, IPA_IOC_ADD_FLT_RULE_AFTER, ruleTable); - - for (int cnt = 0; cnt<ruleTable->num_rules; cnt++) - { - if(ruleTable->rules[cnt].status != 0) - { - IPACMERR("Adding Filter rule:%d failed with status:%d\n", - cnt, ruleTable->rules[cnt].status); - } - } - - if (retval != 0) - { - IPACMERR("Failed adding Filtering rule %p\n", ruleTable); - return false; - } - IPACMDBG("Added Filtering rule %p\n", ruleTable); -#endif - return true; -} - -bool IPACM_Filtering::DeleteFilteringRule(struct ipa_ioc_del_flt_rule *ruleTable) -{ - int retval = 0; - - retval = ioctl(fd, IPA_IOC_DEL_FLT_RULE, ruleTable); - if (retval != 0) - { - IPACMERR("Failed deleting Filtering rule %p\n", ruleTable); - return false; - } - - IPACMDBG("Deleted Filtering rule %p\n", ruleTable); - return true; -} - -bool IPACM_Filtering::Commit(enum ipa_ip_type ip) -{ - int retval = 0; - - retval = ioctl(fd, IPA_IOC_COMMIT_FLT, ip); - if (retval != 0) - { - IPACMERR("failed committing Filtering rules.\n"); - return false; - } - - IPACMDBG("Committed Filtering rules to IPA HW.\n"); - return true; -} - -bool IPACM_Filtering::Reset(enum ipa_ip_type ip) -{ - int retval = 0; - - retval = ioctl(fd, IPA_IOC_RESET_FLT, ip); - retval |= ioctl(fd, IPA_IOC_COMMIT_FLT, ip); - if (retval) - { - IPACMERR("failed resetting Filtering block.\n"); - return false; - } - - IPACMDBG("Reset command issued to IPA Filtering block.\n"); - return true; -} - -bool IPACM_Filtering::DeleteFilteringHdls -( - uint32_t *flt_rule_hdls, - ipa_ip_type ip, - uint8_t num_rules -) -{ - struct ipa_ioc_del_flt_rule *flt_rule; - bool res = true; - int len = 0, cnt = 0; - const uint8_t UNIT_RULES = 1; - - len = (sizeof(struct ipa_ioc_del_flt_rule)) + (UNIT_RULES * sizeof(struct ipa_flt_rule_del)); - flt_rule = (struct ipa_ioc_del_flt_rule *)malloc(len); - if (flt_rule == NULL) - { - IPACMERR("unable to allocate memory for del filter rule\n"); - return false; - } - - for (cnt = 0; cnt < num_rules; cnt++) - { - memset(flt_rule, 0, len); - flt_rule->commit = 1; - flt_rule->num_hdls = UNIT_RULES; - flt_rule->ip = ip; - - if (flt_rule_hdls[cnt] == 0) - { - IPACMERR("invalid filter handle passed, ignoring it: %d\n", cnt) - } - else - { - - flt_rule->hdl[0].status = -1; - flt_rule->hdl[0].hdl = flt_rule_hdls[cnt]; - IPACMDBG("Deleting filter hdl:(0x%x) with ip type: %d\n", flt_rule_hdls[cnt], ip); - - if (DeleteFilteringRule(flt_rule) == false) - { - PERROR("Filter rule deletion failed!\n"); - res = false; - goto fail; - } - else - { - - if (flt_rule->hdl[0].status != 0) - { - IPACMERR("Filter rule hdl 0x%x deletion failed with error:%d\n", - flt_rule->hdl[0].hdl, flt_rule->hdl[0].status); - res = false; - goto fail; - } - } - } - } - -fail: - free(flt_rule); - - return res; -} - -bool IPACM_Filtering::AddWanDLFilteringRule(struct ipa_ioc_add_flt_rule const *rule_table_v4, struct ipa_ioc_add_flt_rule const * rule_table_v6, uint8_t mux_id) -{ - int ret = 0, cnt, num_rules = 0, pos = 0; - ipa_install_fltr_rule_req_msg_v01 qmi_rule_msg; -#ifdef FEATURE_IPA_V3 - ipa_install_fltr_rule_req_ex_msg_v01 qmi_rule_ex_msg; -#endif - - int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); - if(fd_wwan_ioctl < 0) - { - IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME); - return false; - } - - if(rule_table_v4 != NULL) - { - num_rules += rule_table_v4->num_rules; - IPACMDBG_H("Get %d WAN DL IPv4 filtering rules.\n", rule_table_v4->num_rules); - } - if(rule_table_v6 != NULL) - { - num_rules += rule_table_v6->num_rules; - IPACMDBG_H("Get %d WAN DL IPv6 filtering rules.\n", rule_table_v6->num_rules); - } - - /* if it is not IPA v3, use old QMI format */ -#ifndef FEATURE_IPA_V3 - if(num_rules > QMI_IPA_MAX_FILTERS_V01) - { - IPACMERR("The number of filtering rules exceed limit.\n"); - close(fd_wwan_ioctl); - return false; - } - else - { - memset(&qmi_rule_msg, 0, sizeof(qmi_rule_msg)); - - if (num_rules > 0) - { - qmi_rule_msg.filter_spec_list_valid = true; - } - else - { - qmi_rule_msg.filter_spec_list_valid = false; - } - - qmi_rule_msg.filter_spec_list_len = num_rules; - qmi_rule_msg.source_pipe_index_valid = 0; - - IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules); - - if(rule_table_v4 != NULL) - { - for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--) - { - if (pos < QMI_IPA_MAX_FILTERS_V01) - { - qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos; - qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01; - qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action); - qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1; - qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx; - qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1; - qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id; - memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule, - &rule_table_v4->rules[cnt].rule.eq_attrib, - sizeof(struct ipa_filter_rule_type_v01)); - pos++; - } - else - { - IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos); - } - } - } - - if(rule_table_v6 != NULL) - { - for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--) - { - if (pos < QMI_IPA_MAX_FILTERS_V01) - { - qmi_rule_msg.filter_spec_list[pos].filter_spec_identifier = pos; - qmi_rule_msg.filter_spec_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01; - qmi_rule_msg.filter_spec_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action); - qmi_rule_msg.filter_spec_list[pos].is_routing_table_index_valid = 1; - qmi_rule_msg.filter_spec_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx; - qmi_rule_msg.filter_spec_list[pos].is_mux_id_valid = 1; - qmi_rule_msg.filter_spec_list[pos].mux_id = mux_id; - memcpy(&qmi_rule_msg.filter_spec_list[pos].filter_rule, - &rule_table_v6->rules[cnt].rule.eq_attrib, - sizeof(struct ipa_filter_rule_type_v01)); - pos++; - } - else - { - IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_V01, pos); - } - } - } - - ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE, &qmi_rule_msg); - if (ret != 0) - { - IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_msg, ret); - close(fd_wwan_ioctl); - return false; - } - } - /* if it is IPA v3, use new QMI format */ -#else - if(num_rules > QMI_IPA_MAX_FILTERS_EX_V01) - { - IPACMERR("The number of filtering rules exceed limit.\n"); - close(fd_wwan_ioctl); - return false; - } - else - { - memset(&qmi_rule_ex_msg, 0, sizeof(qmi_rule_ex_msg)); - - if (num_rules > 0) - { - qmi_rule_ex_msg.filter_spec_ex_list_valid = true; - } - else - { - qmi_rule_ex_msg.filter_spec_ex_list_valid = false; - } - qmi_rule_ex_msg.filter_spec_ex_list_len = num_rules; - qmi_rule_ex_msg.source_pipe_index_valid = 0; - - IPACMDBG_H("Get %d WAN DL filtering rules in total.\n", num_rules); - - if(rule_table_v4 != NULL) - { - for(cnt = rule_table_v4->num_rules - 1; cnt >= 0; cnt--) - { - if (pos < QMI_IPA_MAX_FILTERS_EX_V01) - { - qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V4_V01; - qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v4->rules[cnt].rule.action); - qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1; - qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v4->rules[cnt].rule.rt_tbl_idx; - qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1; - qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id; - qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v4->rules[cnt].rule.rule_id; - qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v4->rules[cnt].rule.hashable; - memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule, - &rule_table_v4->rules[cnt].rule.eq_attrib, - sizeof(struct ipa_filter_rule_type_v01)); - - pos++; - } - else - { - IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos); - } - } - } - - if(rule_table_v6 != NULL) - { - for(cnt = rule_table_v6->num_rules - 1; cnt >= 0; cnt--) - { - if (pos < QMI_IPA_MAX_FILTERS_EX_V01) - { - qmi_rule_ex_msg.filter_spec_ex_list[pos].ip_type = QMI_IPA_IP_TYPE_V6_V01; - qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_action = GetQmiFilterAction(rule_table_v6->rules[cnt].rule.action); - qmi_rule_ex_msg.filter_spec_ex_list[pos].is_routing_table_index_valid = 1; - qmi_rule_ex_msg.filter_spec_ex_list[pos].route_table_index = rule_table_v6->rules[cnt].rule.rt_tbl_idx; - qmi_rule_ex_msg.filter_spec_ex_list[pos].is_mux_id_valid = 1; - qmi_rule_ex_msg.filter_spec_ex_list[pos].mux_id = mux_id; - qmi_rule_ex_msg.filter_spec_ex_list[pos].rule_id = rule_table_v6->rules[cnt].rule.rule_id; - qmi_rule_ex_msg.filter_spec_ex_list[pos].is_rule_hashable = rule_table_v6->rules[cnt].rule.hashable; - memcpy(&qmi_rule_ex_msg.filter_spec_ex_list[pos].filter_rule, - &rule_table_v6->rules[cnt].rule.eq_attrib, - sizeof(struct ipa_filter_rule_type_v01)); - - pos++; - } - else - { - IPACMERR(" QMI only support max %d rules, current (%d)\n ",QMI_IPA_MAX_FILTERS_EX_V01, pos); - } - } - } - - ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE_EX, &qmi_rule_ex_msg); - if (ret != 0) - { - IPACMERR("Failed adding Filtering rule %p with ret %d\n ", &qmi_rule_ex_msg, ret); - close(fd_wwan_ioctl); - return false; - } - } -#endif - - close(fd_wwan_ioctl); - return true; -} - -bool IPACM_Filtering::SendFilteringRuleIndex(struct ipa_fltr_installed_notif_req_msg_v01* table) -{ - int ret = 0; - int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); - if(fd_wwan_ioctl < 0) - { - IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME); - return false; - } - - ret = ioctl(fd_wwan_ioctl, WAN_IOC_ADD_FLT_RULE_INDEX, table); - if (ret != 0) - { - IPACMERR("Failed adding filtering rule index %p with ret %d\n", table, ret); - close(fd_wwan_ioctl); - return false; - } - - IPACMDBG("Added Filtering rule index %p\n", table); - close(fd_wwan_ioctl); - return true; -} - -ipa_filter_action_enum_v01 IPACM_Filtering::GetQmiFilterAction(ipa_flt_action action) -{ - switch(action) - { - case IPA_PASS_TO_ROUTING: - return QMI_IPA_FILTER_ACTION_ROUTING_V01; - - case IPA_PASS_TO_SRC_NAT: - return QMI_IPA_FILTER_ACTION_SRC_NAT_V01; - - case IPA_PASS_TO_DST_NAT: - return QMI_IPA_FILTER_ACTION_DST_NAT_V01; - - case IPA_PASS_TO_EXCEPTION: - return QMI_IPA_FILTER_ACTION_EXCEPTION_V01; - - default: - return IPA_FILTER_ACTION_ENUM_MAX_ENUM_VAL_V01; - } -} - -bool IPACM_Filtering::ModifyFilteringRule(struct ipa_ioc_mdfy_flt_rule* ruleTable) -{ - int i, ret = 0; - - IPACMDBG("Printing filtering add attributes\n"); - IPACMDBG("IP type: %d Number of rules: %d commit value: %d\n", ruleTable->ip, ruleTable->num_rules, ruleTable->commit); - - for (i=0; i<ruleTable->num_rules; i++) - { - IPACMDBG("Filter rule:%d attrib mask: 0x%x\n", i, ruleTable->rules[i].rule.attrib.attrib_mask); - } - - ret = ioctl(fd, IPA_IOC_MDFY_FLT_RULE, ruleTable); - if (ret != 0) - { - IPACMERR("Failed modifying filtering rule %p\n", ruleTable); - - for (i = 0; i < ruleTable->num_rules; i++) - { - if (ruleTable->rules[i].status != 0) - { - IPACMERR("Modifying filter rule %d failed\n", i); - } - } - return false; - } - - IPACMDBG("Modified filtering rule %p\n", ruleTable); - return true; -} - diff --git a/ipacm/src/IPACM_Header.cpp b/ipacm/src/IPACM_Header.cpp deleted file mode 100644 index c77c69c..0000000 --- a/ipacm/src/IPACM_Header.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -#include <unistd.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> - -#include "IPACM_Header.h" -#include "IPACM_Log.h" - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -//All interaction through the driver are made through this inode. -static const char *DEVICE_NAME = "/dev/ipa"; - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -IPACM_Header::IPACM_Header() -{ - m_fd = open(DEVICE_NAME, O_RDWR); - if (-1 == m_fd) - { - IPACMERR("Failed to open %s in IPACM_Header test application constructor.\n", DEVICE_NAME); - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -IPACM_Header::~IPACM_Header() -{ - if (-1 != m_fd) - { - close(m_fd); - } -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::DeviceNodeIsOpened() -{ - return (-1 != m_fd); -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::AddHeader(struct ipa_ioc_add_hdr *pHeaderTableToAdd) -{ - int nRetVal = 0; - //call the Driver ioctl in order to add header - nRetVal = ioctl(m_fd, IPA_IOC_ADD_HDR, pHeaderTableToAdd); - IPACMDBG("return value: %d\n", nRetVal); - return (-1 != nRetVal); -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::DeleteHeader(struct ipa_ioc_del_hdr *pHeaderTableToDelete) -{ - int nRetVal = 0; - //call the Driver ioctl in order to remove header - nRetVal = ioctl(m_fd, IPA_IOC_DEL_HDR, pHeaderTableToDelete); - IPACMDBG("return value: %d\n", nRetVal); - return (-1 != nRetVal); -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::Commit() -{ - int nRetVal = 0; - nRetVal = ioctl(m_fd, IPA_IOC_COMMIT_HDR); - IPACMDBG("return value: %d\n", nRetVal); - return true; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::Reset() -{ - int nRetVal = 0; - - nRetVal = ioctl(m_fd, IPA_IOC_RESET_HDR); - nRetVal |= ioctl(m_fd, IPA_IOC_COMMIT_HDR); - IPACMDBG("return value: %d\n", nRetVal); - return true; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::GetHeaderHandle(struct ipa_ioc_get_hdr *pHeaderStruct) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_GET_HDR, pHeaderStruct); - if (retval) - { - IPACMERR("IPA_IOC_GET_HDR ioctl failed, routingTable =0x%p, retval=0x%x.\n", pHeaderStruct, retval); - return false; - } - - IPACMDBG("IPA_IOC_GET_HDR ioctl issued to IPA header insertion block.\n"); - return true; -} - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -bool IPACM_Header::CopyHeader(struct ipa_ioc_copy_hdr *pCopyHeaderStruct) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_COPY_HDR, pCopyHeaderStruct); - if (retval) - { - IPACMERR("IPA_IOC_COPY_HDR ioctl failed, retval=0x%x.\n", retval); - return false; - } - - IPACMDBG("IPA_IOC_COPY_HDR ioctl issued to IPA header insertion block.\n"); - return true; -} - -bool IPACM_Header::DeleteHeaderHdl(uint32_t hdr_hdl) -{ - const uint8_t NUM_HDLS = 1; - struct ipa_ioc_del_hdr *pHeaderDescriptor = NULL; - struct ipa_hdr_del *hd_rule_entry; - int len = 0; - bool res = true; - - if (hdr_hdl == 0) - { - IPACMERR("Invalid header handle passed. Ignoring it\n"); - return false; - } - - len = (sizeof(struct ipa_ioc_del_hdr)) + (NUM_HDLS * sizeof(struct ipa_hdr_del)); - pHeaderDescriptor = (struct ipa_ioc_del_hdr *)malloc(len); - if (pHeaderDescriptor == NULL) - { - IPACMERR("Unable to allocate memory for del header\n"); - return false; - } - - memset(pHeaderDescriptor, 0, len); - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdls = NUM_HDLS; - hd_rule_entry = &pHeaderDescriptor->hdl[0]; - - hd_rule_entry->hdl = hdr_hdl; - hd_rule_entry->status = -1; - - IPACMDBG("Deleting Header hdl:(%x)\n", hd_rule_entry->hdl); - if ((false == DeleteHeader(pHeaderDescriptor)) || - (hd_rule_entry->status)) - { - IPACMERR("Header hdl:(%x) deletion failed! status: %d\n", hd_rule_entry->hdl,hd_rule_entry->status); - res = false; - goto fail; - } - - IPACMDBG_H("Deleted Header hdl:(%x) successfully\n", hd_rule_entry->hdl); - -fail: - free(pHeaderDescriptor); - - return res; - -} - -bool IPACM_Header::AddHeaderProcCtx(struct ipa_ioc_add_hdr_proc_ctx* pHeader) -{ - int ret = 0; - //call the Driver ioctl to add header processing context - ret = ioctl(m_fd, IPA_IOC_ADD_HDR_PROC_CTX, pHeader); - return (ret == 0); -} - -bool IPACM_Header::DeleteHeaderProcCtx(uint32_t hdl) -{ - int len, ret; - struct ipa_ioc_del_hdr_proc_ctx* pHeaderTable = NULL; - - len = sizeof(struct ipa_ioc_del_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_del); - pHeaderTable = (struct ipa_ioc_del_hdr_proc_ctx*)malloc(len); - if(pHeaderTable == NULL) - { - IPACMERR("Failed to allocate buffer.\n"); - return false; - } - memset(pHeaderTable, 0, len); - - pHeaderTable->commit = 1; - pHeaderTable->num_hdls = 1; - pHeaderTable->hdl[0].hdl = hdl; - - ret = ioctl(m_fd, IPA_IOC_DEL_HDR_PROC_CTX, pHeaderTable); - if(ret != 0) - { - IPACMERR("Failed to delete hdr proc ctx: return value %d, status %d\n", - ret, pHeaderTable->hdl[0].status); - } - free(pHeaderTable); - return (ret == 0); -} - diff --git a/ipacm/src/IPACM_Iface.cpp b/ipacm/src/IPACM_Iface.cpp deleted file mode 100644 index 84132c9..0000000 --- a/ipacm/src/IPACM_Iface.cpp +++ /dev/null @@ -1,995 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -* Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Z -*/ -/*! - @file - IPACM_Iface.cpp - - @brief - This file implements the basis Iface functionality. - - @Author - Skylar Chang - -*/ -#include <fcntl.h> -#include <sys/ioctl.h> -#include <IPACM_Netlink.h> -#include <IPACM_Iface.h> -#include <IPACM_Lan.h> -#include <IPACM_Wan.h> -#include <IPACM_Wlan.h> -#include <string.h> - -extern "C" -{ -#include <ifaddrs.h> -} - - -const char *IPACM_Iface::DEVICE_NAME = "/dev/ipa"; -IPACM_Routing IPACM_Iface::m_routing; -IPACM_Filtering IPACM_Iface::m_filtering; -IPACM_Header IPACM_Iface::m_header; - -IPACM_Config *IPACM_Iface::ipacmcfg = IPACM_Config::GetInstance(); - -IPACM_Iface::IPACM_Iface(int iface_index) -{ - ip_type = IPACM_IP_NULL; /* initially set invalid */ - num_dft_rt_v6 = 0; - softwarerouting_act = false; - ipa_if_num = iface_index; - ipa_if_cate = IPACM_Iface::ipacmcfg->iface_table[iface_index].if_cat; - - iface_query = NULL; - tx_prop = NULL; - rx_prop = NULL; - - memcpy(dev_name, - IPACM_Iface::ipacmcfg->iface_table[iface_index].iface_name, - sizeof(IPACM_Iface::ipacmcfg->iface_table[iface_index].iface_name)); - - memset(dft_v4fl_rule_hdl, 0, sizeof(dft_v4fl_rule_hdl)); - memset(dft_v6fl_rule_hdl, 0, sizeof(dft_v6fl_rule_hdl)); - - memset(dft_rt_rule_hdl, 0, sizeof(dft_rt_rule_hdl)); - memset(software_routing_fl_rule_hdl, 0, sizeof(software_routing_fl_rule_hdl)); - memset(ipv6_addr, 0, sizeof(ipv6_addr)); - - query_iface_property(); - IPACMDBG_H(" create iface-index(%d) constructor\n", ipa_if_num); - return; -} - -/* software routing enable */ -int IPACM_Iface::handle_software_routing_enable(void) -{ - - int res = IPACM_SUCCESS; - struct ipa_flt_rule_add flt_rule_entry; - ipa_ioc_add_flt_rule *m_pFilteringTable; - - IPACMDBG("\n"); - if (softwarerouting_act == true) - { - IPACMDBG("already setup software_routing rule for (%s)iface ip-family %d\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type); - return IPACM_SUCCESS; - } - - if(rx_prop == NULL) - { - IPACMDBG("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *) - calloc(1, - sizeof(struct ipa_ioc_add_flt_rule) + - 1 * sizeof(struct ipa_flt_rule_add) - ); - if (!m_pFilteringTable) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->num_rules = (uint8_t)1; - - - /* Configuring Software-Routing Filtering Rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = false; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* check iface is v4 or v6 or both*/ -// if (ip_type == IPA_IP_MAX) -// { - /* handle v4 */ - m_pFilteringTable->ip = IPA_IP_v4; - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (m_pFilteringTable->rules[0].status) - { - IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status); - res = IPACM_FAILURE; - goto fail; - } - - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - IPACMDBG("soft-routing flt rule hdl0=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl); - /* copy filter hdls */ - software_routing_fl_rule_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl; - - - /* handle v6*/ - m_pFilteringTable->ip = IPA_IP_v6; - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (m_pFilteringTable->rules[0].status) - { - IPACMDBG("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status); - res = IPACM_FAILURE; - goto fail; - } - - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - IPACMDBG("soft-routing flt rule hdl0=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl); - /* copy filter hdls */ - software_routing_fl_rule_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl; - softwarerouting_act = true; -#if 0 - } - else - { - if (ip_type == IPA_IP_v4) - { - m_pFilteringTable->ip = IPA_IP_v4; - } - else - { - m_pFilteringTable->ip = IPA_IP_v6; - } - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (m_pFilteringTable->rules[0].status) - { - IPACMERR("adding flt rule failed status=0x%x\n", m_pFilteringTable->rules[0].status); - res = IPACM_FAILURE; - goto fail; - } - - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, ip_type, 1); - IPACMDBG("soft-routing flt rule hdl0=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl); - /* copy filter hdls */ - if (ip_type == IPA_IP_v4) - { - software_routing_fl_rule_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl; - } - else - { - software_routing_fl_rule_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl; - } - softwarerouting_act = true; - } -#endif - -fail: - free(m_pFilteringTable); - - return res; -} - -/* software routing disable */ -int IPACM_Iface::handle_software_routing_disable(void) -{ - int res = IPACM_SUCCESS; - ipa_ip_type ip; - uint32_t flt_hdl; - - if (rx_prop == NULL) - { - IPACMDBG("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if (softwarerouting_act == false) - { - IPACMDBG("already delete software_routing rule for (%s)iface ip-family %d\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type); - return IPACM_SUCCESS; - } - -// if (ip_type == IPA_IP_MAX) -// { - /* ipv4 case */ - if (m_filtering.DeleteFilteringHdls(&software_routing_fl_rule_hdl[0], - IPA_IP_v4, 1) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - - /* ipv6 case */ - if (m_filtering.DeleteFilteringHdls(&software_routing_fl_rule_hdl[1], - IPA_IP_v6, 1) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - softwarerouting_act = false; -#if 0 - } - else - { - if (ip_type == IPA_IP_v4) - { - ip = IPA_IP_v4; - } - else - { - ip = IPA_IP_v6; - } - - - if (ip_type == IPA_IP_v4) - { - flt_hdl = software_routing_fl_rule_hdl[0]; - } - else - { - flt_hdl = software_routing_fl_rule_hdl[1]; - } - - if (m_filtering.DeleteFilteringHdls(&flt_hdl, ip, 1) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, ip, 1); - softwarerouting_act = false; - } -#endif - -fail: - return res; -} - -/* Query ipa_interface_index by given linux interface_index */ -int IPACM_Iface::iface_ipa_index_query -( - int interface_index -) -{ - int fd; - int link = INVALID_IFACE; - int i = 0; - struct ifreq ifr; - - - if(IPACM_Iface::ipacmcfg->iface_table == NULL) - { - IPACMERR("Iface table in IPACM_Config is not available.\n"); - return link; - } - - /* Search known linux interface-index and map to IPA interface-index*/ - for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_ipa_interfaces; i++) - { - if (interface_index == IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index) - { - link = i; - IPACMDBG("Interface (%s) found: linux(%d) ipa(%d) \n", - IPACM_Iface::ipacmcfg->iface_table[i].iface_name, - IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index, - link); - return link; - break; - } - } - - /* Search/Configure linux interface-index and map it to IPA interface-index */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - PERROR("get interface name socket create failed"); - return IPACM_FAILURE; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - - ifr.ifr_ifindex = interface_index; - IPACMDBG_H("Interface index %d\n", interface_index); - - if (ioctl(fd, SIOCGIFNAME, &ifr) < 0) - { - PERROR("call_ioctl_on_dev: ioctl failed:"); - close(fd); - return IPACM_FAILURE; - } - close(fd); - - IPACMDBG_H("Received interface name %s\n", ifr.ifr_name); - for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_ipa_interfaces; i++) - { - if (strncmp(ifr.ifr_name, - IPACM_Iface::ipacmcfg->iface_table[i].iface_name, - sizeof(IPACM_Iface::ipacmcfg->iface_table[i].iface_name)) == 0) - { - IPACMDBG_H("Interface (%s) linux(%d) mapped to ipa(%d) \n", ifr.ifr_name, - IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index, i); - - link = i; - IPACM_Iface::ipacmcfg->iface_table[i].netlink_interface_index = interface_index; - break; - } - } - - return link; -} - -/* Query ipa_interface ipv4_addr by given linux interface_index */ -void IPACM_Iface::iface_addr_query -( - int interface_index -) -{ - int fd; - struct ifreq ifr; - struct ifaddrs *myaddrs, *ifa; - ipacm_cmd_q_data evt_data; - ipacm_event_data_addr *data_addr; - struct in_addr iface_ipv4; - - /* use linux interface-index to find interface name */ - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - PERROR("get interface name socket create failed"); - return ; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - - ifr.ifr_ifindex = interface_index; - IPACMDBG_H("Interface index %d\n", interface_index); - - if (ioctl(fd, SIOCGIFNAME, &ifr) < 0) - { - PERROR("call_ioctl_on_dev: ioctl failed:"); - close(fd); - return ; - } - IPACMDBG_H("Interface index %d name: %s\n", interface_index,ifr.ifr_name); - close(fd); - - /* query ipv4/v6 address */ - if(getifaddrs(&myaddrs) != 0) - { - IPACMERR("getifaddrs"); - return ; - } - - for (ifa = myaddrs; ifa != NULL; ifa = ifa->ifa_next) - { - if (ifa->ifa_addr == NULL) - continue; - if (!(ifa->ifa_flags & IFF_UP)) - continue; - - if(strcmp(ifr.ifr_name,ifa->ifa_name) == 0) // find current iface - { - IPACMDBG_H("Internal post new_addr event for iface %s\n", ifa->ifa_name); - switch (ifa->ifa_addr->sa_family) - { - case AF_INET: - { - struct sockaddr_in *s4 = (struct sockaddr_in *)ifa->ifa_addr; - IPACMDBG_H("ipv4 address %s\n",inet_ntoa(s4->sin_addr)); - iface_ipv4 = s4->sin_addr; - /* post new_addr event to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - freeifaddrs(myaddrs); - return ; - } - data_addr->iptype = IPA_IP_v4; - data_addr->if_index = interface_index; - data_addr->ipv4_addr = iface_ipv4.s_addr; - data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr); - IPACMDBG_H("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv4 addr:0x%x\n", - data_addr->if_index, - data_addr->ipv4_addr); - - evt_data.event = IPA_ADDR_ADD_EVENT; - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - break; - } - - case AF_INET6: - { - struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)ifa->ifa_addr; - /* post new_addr event to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - freeifaddrs(myaddrs); - return ; - } - data_addr->iptype = IPA_IP_v6; - data_addr->if_index = interface_index; - memcpy(data_addr->ipv6_addr, - &s6->sin6_addr, - sizeof(data_addr->ipv6_addr)); - data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]); - IPACMDBG_H("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv6 addr:0x%x:%x:%x:%x\n", - data_addr->if_index, - data_addr->ipv6_addr[0], data_addr->ipv6_addr[1], data_addr->ipv6_addr[2], data_addr->ipv6_addr[3]); - - evt_data.event = IPA_ADDR_ADD_EVENT; - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - break; - } - - default: - continue; - } - } - } - freeifaddrs(myaddrs); - return ; -} - -/*Query the IPA endpoint property */ -int IPACM_Iface::query_iface_property(void) -{ - int res = IPACM_SUCCESS, fd = 0; - uint32_t cnt=0; - - fd = open(DEVICE_NAME, O_RDWR); - IPACMDBG("iface query-property \n"); - if (0 == fd) - { - IPACMERR("Failed opening %s.\n", DEVICE_NAME); - return IPACM_FAILURE; - } - - iface_query = (struct ipa_ioc_query_intf *) - calloc(1, sizeof(struct ipa_ioc_query_intf)); - if(iface_query == NULL) - { - IPACMERR("Unable to allocate iface_query memory.\n"); - close(fd); - return IPACM_FAILURE; - } - IPACMDBG_H("iface name %s\n", dev_name); - memcpy(iface_query->name, dev_name, sizeof(dev_name)); - - if (ioctl(fd, IPA_IOC_QUERY_INTF, iface_query) < 0) - { - PERROR("ioctl IPA_IOC_QUERY_INTF failed\n"); - /* iface_query memory will free when iface-down*/ - res = IPACM_FAILURE; - } - - if(iface_query->num_tx_props > 0) - { - tx_prop = (struct ipa_ioc_query_intf_tx_props *) - calloc(1, sizeof(struct ipa_ioc_query_intf_tx_props) + - iface_query->num_tx_props * sizeof(struct ipa_ioc_tx_intf_prop)); - if(tx_prop == NULL) - { - IPACMERR("Unable to allocate tx_prop memory.\n"); - close(fd); - return IPACM_FAILURE; - } - memcpy(tx_prop->name, dev_name, sizeof(tx_prop->name)); - tx_prop->num_tx_props = iface_query->num_tx_props; - - if (ioctl(fd, IPA_IOC_QUERY_INTF_TX_PROPS, tx_prop) < 0) - { - PERROR("ioctl IPA_IOC_QUERY_INTF_TX_PROPS failed\n"); - /* tx_prop memory will free when iface-down*/ - res = IPACM_FAILURE; - } - - if (res != IPACM_FAILURE) - { - for (cnt = 0; cnt < tx_prop->num_tx_props; cnt++) - { - IPACMDBG_H("Tx(%d):attrib-mask:0x%x, ip-type: %d, dst_pipe: %d, alt_dst_pipe: %d, header: %s\n", - cnt, tx_prop->tx[cnt].attrib.attrib_mask, - tx_prop->tx[cnt].ip, tx_prop->tx[cnt].dst_pipe, - tx_prop->tx[cnt].alt_dst_pipe, - tx_prop->tx[cnt].hdr_name); - - if (tx_prop->tx[cnt].dst_pipe == 0) - { - IPACMERR("Tx(%d): wrong tx property: dst_pipe: 0.\n", cnt); - close(fd); - return IPACM_FAILURE; - } - if (tx_prop->tx[cnt].alt_dst_pipe == 0 && - ((memcmp(dev_name, "wlan0", sizeof("wlan0")) == 0) || - (memcmp(dev_name, "wlan1", sizeof("wlan1")) == 0))) - { - IPACMERR("Tx(%d): wrong tx property: alt_dst_pipe: 0. \n", cnt); - close(fd); - return IPACM_FAILURE; - } - - } - } - - } - - if (iface_query->num_rx_props > 0) - { - rx_prop = (struct ipa_ioc_query_intf_rx_props *) - calloc(1, sizeof(struct ipa_ioc_query_intf_rx_props) + - iface_query->num_rx_props * sizeof(struct ipa_ioc_rx_intf_prop)); - if(rx_prop == NULL) - { - IPACMERR("Unable to allocate rx_prop memory.\n"); - close(fd); - return IPACM_FAILURE; - } - memcpy(rx_prop->name, dev_name, - sizeof(rx_prop->name)); - rx_prop->num_rx_props = iface_query->num_rx_props; - - if (ioctl(fd, IPA_IOC_QUERY_INTF_RX_PROPS, rx_prop) < 0) - { - PERROR("ioctl IPA_IOC_QUERY_INTF_RX_PROPS failed\n"); - /* rx_prop memory will free when iface-down*/ - res = IPACM_FAILURE; - } - - if (res != IPACM_FAILURE) - { - for (cnt = 0; cnt < rx_prop->num_rx_props; cnt++) - { - IPACMDBG_H("Rx(%d):attrib-mask:0x%x, ip-type: %d, src_pipe: %d\n", - cnt, rx_prop->rx[cnt].attrib.attrib_mask, rx_prop->rx[cnt].ip, rx_prop->rx[cnt].src_pipe); - } - } - } - - /* Add Natting iface to IPACM_Config if there is Rx/Tx property */ - if (rx_prop != NULL || tx_prop != NULL) - { - IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name); - IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name); - } - - close(fd); - return res; -} - -/*Configure the initial filter rules */ -int IPACM_Iface::init_fl_rule(ipa_ip_type iptype) -{ - - int res = IPACM_SUCCESS, len = 0; - struct ipa_flt_rule_add flt_rule_entry; - ipa_ioc_add_flt_rule *m_pFilteringTable; - - /* Adding this hack because WLAN may not registered for Rx-endpoint, other ifaces will always have*/ - const char *dev_wlan0="wlan0"; - const char *dev_wlan1="wlan1"; - const char *dev_ecm0="ecm0"; - - /* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */ - if((IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat== WAN_IF) || (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat== EMBMS_IF)) - { - IPACMDBG_H(" NOT add producer dependency on dev %s with registered rx-prop cat:%d \n", dev_name, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat); - } - else - { - if(rx_prop != NULL) - { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe],false); - } - else - { - /* only wlan may take software-path, not register Rx-property*/ - if(strcmp(dev_name,dev_wlan0) == 0 || strcmp(dev_name,dev_wlan1) == 0) - { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_HSIC_PROD); - IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_HSIC_PROD,true); - } - if(strcmp(dev_name,dev_ecm0) == 0) - { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got piperm index : %d \n", IPA_RM_RESOURCE_USB_PROD); - IPACM_Iface::ipacmcfg->AddRmDepend(IPA_RM_RESOURCE_USB_PROD,true); - } - } - } - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - /* construct ipa_ioc_add_flt_rule with default filter rules */ - if (iptype == IPA_IP_v4) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + - (IPV4_DEFAULT_FILTERTING_RULES * sizeof(struct ipa_flt_rule_add)); - - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!m_pFilteringTable) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = iptype; - m_pFilteringTable->num_rules = (uint8_t)IPV4_DEFAULT_FILTERTING_RULES; - - /* Configuring Fragment Filtering Rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = false; - flt_rule_entry.rule.hashable = false; -#endif - IPACMDBG_H("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask); - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring Multicast Filtering Rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xF0000000; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xE0000000; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&(m_pFilteringTable->rules[1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring Broadcast Filtering Rule */ - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&(m_pFilteringTable->rules[2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES); - /* copy filter hdls */ - for (int i = 0; i < IPV4_DEFAULT_FILTERTING_RULES; i++) - { - if (m_pFilteringTable->rules[i].status == 0) - { - dft_v4fl_rule_hdl[i] = m_pFilteringTable->rules[i].flt_rule_hdl; - IPACMDBG_H("Default v4 filter Rule %d HDL:0x%x\n", i, dft_v4fl_rule_hdl[i]); - } - else - { - IPACMERR("Failed adding default v4 Filtering rule %d\n", i); - } - } - } - } - else - { - len = sizeof(struct ipa_ioc_add_flt_rule) + - (IPV6_DEFAULT_FILTERTING_RULES * sizeof(struct ipa_flt_rule_add)); - - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!m_pFilteringTable) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = iptype; - m_pFilteringTable->num_rules = (uint8_t)IPV6_DEFAULT_FILTERTING_RULES; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - /* Configuring Multicast Filtering Rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFF000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0XFF000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring fe80::/10 Link-Scoped Unicast Filtering Rule */ - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0XFFC00000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFE800000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&(m_pFilteringTable->rules[1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring fec0::/10 Reserved by IETF Filtering Rule */ - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0XFFC00000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFEC00000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&(m_pFilteringTable->rules[2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - -#ifdef FEATURE_IPA_ANDROID - IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPV6_DEFAULT_FILTERTING_RULES); - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap = 0; - - if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA) - { - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<14); - flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1; - flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0; - flt_rule_entry.rule.eq_attrib.metadata_meq32.value = rx_prop->rx[0].attrib.meta_data; - flt_rule_entry.rule.eq_attrib.metadata_meq32.mask = rx_prop->rx[0].attrib.meta_data_mask; - } - - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1); - flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1; - flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP; - - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8); - flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1; - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12; - - /* add TCP FIN rule*/ - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT); - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT); - memcpy(&(m_pFilteringTable->rules[3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* add TCP SYN rule*/ - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT); - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT); - memcpy(&(m_pFilteringTable->rules[4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* add TCP RST rule*/ - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT); - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT); - memcpy(&(m_pFilteringTable->rules[5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); -#endif - if (m_filtering.AddFilteringRule(m_pFilteringTable) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES); - /* copy filter hdls */ - for (int i = 0; - i < IPV6_DEFAULT_FILTERTING_RULES; - i++) - { - if (m_pFilteringTable->rules[i].status == 0) - { - dft_v6fl_rule_hdl[i] = m_pFilteringTable->rules[i].flt_rule_hdl; - IPACMDBG_H("Default v6 Filter Rule %d HDL:0x%x\n", i, dft_v6fl_rule_hdl[i]); - } - else - { - IPACMERR("Failing adding v6 default IPV6 rule %d\n", i); - } - } - } - } - - -fail: - free(m_pFilteringTable); - - return res; -} - -/* get ipa interface name */ -int IPACM_Iface::ipa_get_if_index -( - char * if_name, - int * if_index -) -{ - int fd; - struct ifreq ifr; - - if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - IPACMERR("get interface index socket create failed \n"); - return IPACM_FAILURE; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - (void)strncpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); - IPACMDBG_H("interface name (%s)\n", if_name); - - if (ioctl(fd,SIOCGIFINDEX , &ifr) < 0) - { - IPACMERR("call_ioctl_on_dev: ioctl failed, interface name (%s):\n", ifr.ifr_name); - close(fd); - return IPACM_FAILURE; - } - - *if_index = ifr.ifr_ifindex; - IPACMDBG_H("Interface index %d\n", *if_index); - close(fd); - return IPACM_SUCCESS; -} - -void IPACM_Iface::config_ip_type(ipa_ip_type iptype) -{ - /* update the iface ip-type to be IPA_IP_v4, IPA_IP_v6 or both*/ - if (iptype == IPA_IP_v4) - { - if ((ip_type == IPA_IP_v4) || (ip_type == IPA_IP_MAX)) - { - IPACMDBG_H(" interface(%s:%d) already in ip-type %d\n", dev_name, ipa_if_num, ip_type); - return; - } - - if (ip_type == IPA_IP_v6) - { - ip_type = IPA_IP_MAX; - } - else - { - ip_type = IPA_IP_v4; - } - IPACMDBG_H(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type); - } - else - { - if ((ip_type == IPA_IP_v6) || (ip_type == IPA_IP_MAX)) - { - IPACMDBG_H(" interface(%s:%d) already in ip-type %d\n", dev_name, ipa_if_num, ip_type); - return; - } - - if (ip_type == IPA_IP_v4) - { - ip_type = IPA_IP_MAX; - } - else - { - ip_type = IPA_IP_v6; - } - - IPACMDBG_H(" interface(%s:%d) now ip-type is %d\n", dev_name, ipa_if_num, ip_type); - } - - return; -} diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp deleted file mode 100644 index a142553..0000000 --- a/ipacm/src/IPACM_IfaceManager.cpp +++ /dev/null @@ -1,565 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_IfaceManager.cpp - - @brief - This file implements the IPAM iface_manager functionality. - - @Author - Skylar Chang - -*/ -#include <string.h> -#include <sys/ioctl.h> - -#include <IPACM_IfaceManager.h> -#include <IPACM_EvtDispatcher.h> -#include <IPACM_Defs.h> -#include <IPACM_Wlan.h> -#include <IPACM_Lan.h> -#include <IPACM_Wan.h> -#include <IPACM_Iface.h> -#include <IPACM_Log.h> - -iface_instances *IPACM_IfaceManager::head = NULL; - -IPACM_IfaceManager::IPACM_IfaceManager() -{ - IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, this); // register for IPA_CFG_CHANGE event - IPACM_EvtDispatcher::registr(IPA_LINK_UP_EVENT, this); - IPACM_EvtDispatcher::registr(IPA_WLAN_AP_LINK_UP_EVENT, this); // register for wlan AP-iface - IPACM_EvtDispatcher::registr(IPA_WLAN_STA_LINK_UP_EVENT, this); // register for wlan STA-iface -#ifndef FEATURE_IPA_ANDROID - /* only MDM targets support device on bridge mode */ - IPACM_EvtDispatcher::registr(IPA_BRIDGE_LINK_UP_EVENT, this); // register for IPA_BRIDGE_LINK_UP_EVENT event -#endif /* not defined(FEATURE_IPA_ANDROID)*/ - IPACM_EvtDispatcher::registr(IPA_USB_LINK_UP_EVENT, this); // register for USB-iface - IPACM_EvtDispatcher::registr(IPA_WAN_EMBMS_LINK_UP_EVENT, this); // register for wan eMBMS-iface - return; -} - -void IPACM_IfaceManager::event_callback(ipa_cm_event_id event, void *param) -{ - int ipa_interface_index; - ipacm_event_data_fid *evt_data = (ipacm_event_data_fid *)param; - ipacm_event_data_mac *StaData = (ipacm_event_data_mac *)param; - ipacm_event_data_all *data_all = (ipacm_event_data_all *)param; - ipacm_ifacemgr_data ifmgr_data = {0}; - - switch(event) - { - case IPA_CFG_CHANGE_EVENT: - IPACMDBG_H(" RESET IPACM_cfg \n"); - IPACM_Iface::ipacmcfg->Init(); - break; - case IPA_BRIDGE_LINK_UP_EVENT: - IPACMDBG_H(" Save the bridge0 mac info in IPACM_cfg \n"); - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_BRIDGE_LINK_UP_EVENT: not supported iface id: %d\n", data_all->if_index); - break; - } - /* check if iface is bridge interface*/ - if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) == 0) - { - IPACM_Iface::ipacmcfg->ipa_bridge_enable = true; - memcpy(IPACM_Iface::ipacmcfg->bridge_mac, - data_all->mac_addr, - sizeof(IPACM_Iface::ipacmcfg->bridge_mac)); - IPACMDBG_H("cached bridge0 MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - IPACM_Iface::ipacmcfg->bridge_mac[0], IPACM_Iface::ipacmcfg->bridge_mac[1], IPACM_Iface::ipacmcfg->bridge_mac[2], - IPACM_Iface::ipacmcfg->bridge_mac[3], IPACM_Iface::ipacmcfg->bridge_mac[4], IPACM_Iface::ipacmcfg->bridge_mac[5]); - } - break; - case IPA_LINK_UP_EVENT: - IPACMDBG_H("Recieved IPA_LINK_UP_EVENT event: link up %d: \n", evt_data->if_index); - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index); - break; - } - /* LTE-backhaul */ - if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == EMBMS_IF) - { - IPACMDBG("WAN-EMBMS (%s) link already up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index); - } - else if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF) - { - IPACMDBG_H("WAN-LTE (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index); - ifmgr_data.if_index = evt_data->if_index; - ifmgr_data.if_type = Q6_WAN; - create_iface_instance(&ifmgr_data); - } - break; - - case IPA_USB_LINK_UP_EVENT: - IPACMDBG_H("Recieved IPA_USB_LINK_UP_EVENT event: link up %d: \n", evt_data->if_index); - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_USB_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index); - break; - } - /* check if it's WAN_IF */ - if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF) - { - /* usb-backhaul using sta_mode ECM_WAN*/ - IPACMDBG_H("WAN-usb (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, evt_data->if_index); - ifmgr_data.if_index = evt_data->if_index; - ifmgr_data.if_type = ECM_WAN; - create_iface_instance(&ifmgr_data); - } - else - { - ifmgr_data.if_index = evt_data->if_index; - ifmgr_data.if_type = Q6_WAN; - create_iface_instance(&ifmgr_data); - } - break; - - case IPA_WLAN_AP_LINK_UP_EVENT: - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_WLAN_AP_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index); - break; - } - /* change iface category from unknown to WLAN_IF */ - if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == UNKNOWN_IF) - { - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = WLAN_IF; - IPACMDBG_H("WLAN AP (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index); - ifmgr_data.if_index = evt_data->if_index; - ifmgr_data.if_type = Q6_WAN; - create_iface_instance(&ifmgr_data); - } - else - { - IPACMDBG_H("iface %s already up and act as %d mode: \n",IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat); - } - break; - - case IPA_WLAN_STA_LINK_UP_EVENT: - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(StaData->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_WLAN_STA_LINK_UP_EVENT: not supported iface id: %d\n", StaData->if_index); - break; - } - /* change iface category from unknown to WAN_IF */ - if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == UNKNOWN_IF) - { - /* wlan-backhaul using sta_mode WLAN_WAN */ - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat = WAN_IF; - IPACMDBG_H("WLAN STA (%s) link up, iface: %d: \n", - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, StaData->if_index); - - ifmgr_data.if_index = StaData->if_index; - ifmgr_data.if_type = WLAN_WAN; - memcpy(ifmgr_data.mac_addr, StaData->mac_addr, sizeof(ifmgr_data.mac_addr)); - create_iface_instance(&ifmgr_data); - } - else - { - IPACMDBG_H("iface %s already up and act as %d mode: \n", - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat); - } - break; - - /* Add new instance open for eMBMS iface and wan iface */ - case IPA_WAN_EMBMS_LINK_UP_EVENT: - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_WAN_EMBMS_LINK_UP_EVENT: not supported iface id: %d\n", evt_data->if_index); - break; - } - /* change iface category from unknown to EMBMS_IF */ - if ((IPACM_Iface::ipacmcfg->ipacm_odu_enable == true) && (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true)) - { - IPACMDBG(" ODU-mode enable or not (%d) \n",IPACM_Iface::ipacmcfg->ipacm_odu_enable); - if(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat == WAN_IF) - { - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat=EMBMS_IF; - IPACMDBG("WAN eMBMS (%s) link up, iface: %d: \n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,evt_data->if_index); - ifmgr_data.if_index = StaData->if_index; - ifmgr_data.if_type = Q6_WAN; - create_iface_instance(&ifmgr_data); - } - else - { - IPACMDBG("iface %s already up and act as %d mode: \n",IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat); - } - } - break; - - default: - break; - } - return; -} - -int IPACM_IfaceManager::create_iface_instance(ipacm_ifacemgr_data *param) -{ - int if_index = param->if_index; - ipacm_wan_iface_type is_sta_mode = param->if_type; - - int ipa_interface_index; - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(if_index); - - if(ipa_interface_index == INVALID_IFACE) - { - IPACMDBG_H("Unhandled interface received, fid: %d\n",if_index); - return IPACM_SUCCESS; - } - - /* check if duplicate instance*/ - if(SearchInstance(ipa_interface_index) == IPA_INSTANCE_NOT_FOUND) - { - /* IPA_INSTANCE_NOT_FOUND */ - switch(IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat) - { - - case LAN_IF: - { - IPACMDBG_H("Creating Lan interface\n"); - IPACM_Lan *lan = new IPACM_Lan(ipa_interface_index); - IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, lan); - //IPACM_EvtDispatcher::registr(IPA_ROUTE_ADD_EVENT, lan); - //IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, lan); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, lan); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, lan); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, lan); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, lan); -#ifdef FEATURE_IPA_ANDROID - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_TETHER, lan); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6_TETHER, lan); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_TETHER, lan); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6_TETHER, lan); -#else - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, lan); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, lan); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, lan); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, lan); -#endif - IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, lan); // register for IPA_CFG_CHANGE event - IPACM_EvtDispatcher::registr(IPA_PRIVATE_SUBNET_CHANGE_EVENT, lan); // register for IPA_PRIVATE_SUBNET_CHANGE_EVENT event -#ifdef FEATURE_IPA_ANDROID - IPACM_EvtDispatcher::registr(IPA_TETHERING_STATS_UPDATE_EVENT, lan); -#endif - IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, lan); - IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, lan); - /* IPA_LAN_DELETE_SELF should be always last */ - IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, lan); - IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", lan->dev_name, lan->ipa_if_num); - registr(ipa_interface_index, lan); - /* solve the new_addr comes earlier issue */ - IPACM_Iface::iface_addr_query(if_index); - } - break; - - case ETH_IF: - { - IPACMDBG_H("Creating ETH interface in router mode\n"); - IPACM_Lan *ETH = new IPACM_Lan(ipa_interface_index); - IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, ETH); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, ETH); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, ETH); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, ETH); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, ETH); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, ETH); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, ETH); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, ETH); - IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, ETH); - IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, ETH); - /* IPA_LAN_DELETE_SELF should be always last */ - IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, ETH); - IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", ETH->dev_name, ETH->ipa_if_num); - registr(ipa_interface_index, ETH); - /* solve the new_addr comes earlier issue */ - IPACM_Iface::iface_addr_query(if_index); - } - break; - - case ODU_IF: - { - if(IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == true) - { - IPACMDBG_H("Creating ODU interface in router mode\n"); - IPACM_Lan *odu = new IPACM_Lan(ipa_interface_index); - IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, odu); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, odu); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT, odu); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, odu); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, odu); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, odu); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, odu); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, odu); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, odu); - IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, odu); - IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, odu); - /* IPA_LAN_DELETE_SELF should be always last */ - IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, odu); - IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", odu->dev_name, odu->ipa_if_num); - registr(ipa_interface_index, odu); - /* solve the new_addr comes earlier issue */ - IPACM_Iface::iface_addr_query(if_index); - } - else - { - IPACMDBG_H("Creating ODU interface in bridge mode\n"); - IPACM_Lan *odu = new IPACM_Lan(ipa_interface_index); - IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, odu); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, odu); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, odu); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, odu); - IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, odu); - /* IPA_LAN_DELETE_SELF should be always last */ - IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, odu); - IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance open/registr ok\n", odu->dev_name, odu->ipa_if_num); - registr(ipa_interface_index, odu); - /* solve the new_addr comes earlier issue */ - IPACM_Iface::iface_addr_query(if_index); - } - } - break; - - case WLAN_IF: - { - IPACMDBG_H("Creating WLan interface\n"); - IPACM_Wlan *wl = new IPACM_Wlan(ipa_interface_index); - IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT_EX, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_DEL_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_POWER_SAVE_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_RECOVER_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, wl); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, wl); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, wl); -#ifdef FEATURE_IPA_ANDROID - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_TETHER, wl); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6_TETHER, wl); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_TETHER, wl); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6_TETHER, wl); -#else - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP, wl); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_UP_V6, wl); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN, wl); - IPACM_EvtDispatcher::registr(IPA_HANDLE_WAN_DOWN_V6, wl); -#endif - IPACM_EvtDispatcher::registr(IPA_PRIVATE_SUBNET_CHANGE_EVENT, wl); // register for IPA_PRIVATE_SUBNET_CHANGE_EVENT event -#ifdef FEATURE_ETH_BRIDGE_LE - IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, wl); -#endif - IPACM_EvtDispatcher::registr(IPA_CRADLE_WAN_MODE_SWITCH, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, wl); -#ifndef FEATURE_IPA_ANDROID - IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, wl); - IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, wl); -#else - IPACM_EvtDispatcher::registr(IPA_TETHERING_STATS_UPDATE_EVENT, wl); -#endif - /* IPA_LAN_DELETE_SELF should be always last */ - IPACM_EvtDispatcher::registr(IPA_LAN_DELETE_SELF, wl); - IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance open/registr ok\n", wl->dev_name, wl->ipa_if_num); - registr(ipa_interface_index, wl); - /* solve the new_addr comes earlier issue */ - IPACM_Iface::iface_addr_query(if_index); - } - break; - - case WAN_IF: - { - if((IPACM_Iface::ipacmcfg->ipacm_odu_enable == false) || (IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == true)) - { - IPACMDBG_H("Creating Wan interface\n"); - IPACM_Wan *w; - if(is_sta_mode == WLAN_WAN) - { - w = new IPACM_Wan(ipa_interface_index, is_sta_mode, param->mac_addr); - } - else - { - w = new IPACM_Wan(ipa_interface_index, is_sta_mode, NULL); - } - IPACM_EvtDispatcher::registr(IPA_ADDR_ADD_EVENT, w); -#ifdef FEATURE_IPA_ANDROID - IPACM_EvtDispatcher::registr(IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT, w); - IPACM_EvtDispatcher::registr(IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT, w); - if(is_sta_mode == Q6_WAN) - { - IPACM_EvtDispatcher::registr(IPA_NETWORK_STATS_UPDATE_EVENT, w); - }; -#else/* defined(FEATURE_IPA_ANDROID) */ - IPACM_EvtDispatcher::registr(IPA_ROUTE_ADD_EVENT, w); - IPACM_EvtDispatcher::registr(IPA_ROUTE_DEL_EVENT, w); -#endif /* not defined(FEATURE_IPA_ANDROID)*/ - IPACM_EvtDispatcher::registr(IPA_FIREWALL_CHANGE_EVENT, w); - IPACM_EvtDispatcher::registr(IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT, w); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_ENABLE, w); - IPACM_EvtDispatcher::registr(IPA_SW_ROUTING_DISABLE, w); - IPACM_EvtDispatcher::registr(IPA_CFG_CHANGE_EVENT, w); // register for IPA_CFG_CHANGE event - IPACM_EvtDispatcher::registr(IPA_WAN_XLAT_CONNECT_EVENT, w); - if(is_sta_mode == WLAN_WAN) - { - IPACM_EvtDispatcher::registr(IPA_WLAN_LINK_DOWN_EVENT, w); // for STA mode -#ifndef FEATURE_IPA_ANDROID - IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_SCC, w); - IPACM_EvtDispatcher::registr(IPA_WLAN_SWITCH_TO_MCC, w); -#endif - } - else - { - IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, w); - } - - IPACMDBG_H("ipa_WAN (%s):ipa_index (%d) instance open/registr ok\n", w->dev_name, w->ipa_if_num); - registr(ipa_interface_index, w); - /* solve the new_addr comes earlier issue */ - IPACM_Iface::iface_addr_query(if_index); - } - } - break; - - /* WAN-eMBMS instance */ - case EMBMS_IF: - { - IPACMDBG("Creating Wan-eMBSM interface\n"); - IPACM_Wan *embms = new IPACM_Wan(ipa_interface_index, is_sta_mode, NULL); - IPACM_EvtDispatcher::registr(IPA_LINK_DOWN_EVENT, embms); - IPACMDBG("ipa_WAN (%s):ipa_index (%d) instance open/registr ok\n", embms->dev_name, embms->ipa_if_num); - registr(ipa_interface_index, embms); - } - break; - - default: - IPACMDBG_H("Unhandled interface category received iface name: %s, category: %d\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].if_cat); - return IPACM_SUCCESS; - } - } - return IPACM_SUCCESS; -} - - -int IPACM_IfaceManager::registr(int ipa_if_index, IPACM_Listener *obj) -{ - iface_instances *tmp = head,*nw; - - nw = (iface_instances *)malloc(sizeof(iface_instances)); - if(nw != NULL) - { - nw->ipa_if_index = ipa_if_index; - nw->obj = obj; - nw->next = NULL; - } - else - { - return IPACM_FAILURE; - } - - if(head == NULL) - { - head = nw; - } - else - { - while(tmp->next) - { - tmp = tmp->next; - } - tmp->next = nw; - } - return IPACM_SUCCESS; -} - -int IPACM_IfaceManager::deregistr(IPACM_Listener *param) -{ - iface_instances *tmp = head,*tmp1,*prev = head; - - while(tmp != NULL) - { - if(tmp->obj == param) - { - tmp1 = tmp; - if(tmp == head) - { - head = head->next; - } - else if(tmp->next == NULL) - { - prev->next = NULL; - } - else - { - prev->next = tmp->next; - } - - tmp = tmp->next; - free(tmp1); - } - else - { - prev = tmp; - tmp = tmp->next; - } - } - return IPACM_SUCCESS; -} - - -int IPACM_IfaceManager::SearchInstance(int ipa_if_index) -{ - - iface_instances *tmp = head; - - while(tmp != NULL) - { - if(ipa_if_index == tmp->ipa_if_index) - { - IPACMDBG_H("Find existed iface-instance name: %s\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_index].iface_name); - return IPA_INSTANCE_FOUND; - } - tmp = tmp->next; - } - - IPACMDBG_H("No existed iface-instance name: %s,\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_index].iface_name); - - return IPA_INSTANCE_NOT_FOUND; -} diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp deleted file mode 100644 index 991e451..0000000 --- a/ipacm/src/IPACM_Lan.cpp +++ /dev/null @@ -1,4261 +0,0 @@ -/* -Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: -* Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following -disclaimer in the documentation and/or other materials provided -with the distribution. - -* Neither the name of The Linux Foundation nor the names of its -contributors may be used to endorse or promote products derived -from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Lan.cpp - - @brief - This file implements the LAN iface functionality. - - @Author - Skylar Chang - -*/ -#include <string.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#include "IPACM_Netlink.h" -#include "IPACM_Lan.h" -#include "IPACM_Wan.h" -#include "IPACM_IfaceManager.h" -#include "linux/rmnet_ipa_fd_ioctl.h" -#include "linux/ipa_qmi_service_v01.h" -#include "linux/msm_ipa.h" -#include "IPACM_ConntrackListener.h" -#include <sys/ioctl.h> -#include <fcntl.h> - -bool IPACM_Lan::odu_up = false; - -IPACM_Lan::IPACM_Lan(int iface_index) : IPACM_Iface(iface_index) -{ - num_eth_client = 0; - header_name_count = 0; - ipv6_set = 0; - ipv4_header_set = false; - ipv6_header_set = false; - odu_route_rule_v4_hdl = NULL; - odu_route_rule_v6_hdl = NULL; - eth_client = NULL; - int i, m_fd_odu, ret = IPACM_SUCCESS; - - Nat_App = NatApp::GetInstance(); - if (Nat_App == NULL) - { - IPACMERR("unable to get Nat App instance \n"); - return; - } - - num_wan_ul_fl_rule_v4 = 0; - num_wan_ul_fl_rule_v6 = 0; - is_active = true; - modem_ul_v4_set = false; - modem_ul_v6_set = false; - is_mode_switch = false; - if_ipv4_subnet =0; - each_client_rt_rule_count[IPA_IP_v4] = 0; - each_client_rt_rule_count[IPA_IP_v6] = 0; - eth_client_len = 0; - - /* support eth multiple clients */ - if(iface_query != NULL) - { - if(ipa_if_cate != WLAN_IF) - { - eth_client_len = (sizeof(ipa_eth_client)) + (iface_query->num_tx_props * sizeof(eth_client_rt_hdl)); - eth_client = (ipa_eth_client *)calloc(IPA_MAX_NUM_ETH_CLIENTS, eth_client_len); - if (eth_client == NULL) - { - IPACMERR("unable to allocate memory\n"); - return; - } - } - - IPACMDBG_H(" IPACM->IPACM_Lan(%d) constructor: Tx:%d Rx:%d \n", ipa_if_num, - iface_query->num_tx_props, iface_query->num_rx_props); - - /* ODU routing table initilization */ - if(ipa_if_cate == ODU_IF) - { - odu_route_rule_v4_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t)); - odu_route_rule_v6_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t)); - if ((odu_route_rule_v4_hdl == NULL) || (odu_route_rule_v6_hdl == NULL)) - { - IPACMERR("unable to allocate memory\n"); - return; - } - } - } - - memset(wan_ul_fl_rule_hdl_v4, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t)); - memset(wan_ul_fl_rule_hdl_v6, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t)); - - memset(ipv4_icmp_flt_rule_hdl, 0, NUM_IPV4_ICMP_FLT_RULE * sizeof(uint32_t)); - - memset(private_fl_rule_hdl, 0, IPA_MAX_PRIVATE_SUBNET_ENTRIES * sizeof(uint32_t)); - memset(ipv6_prefix_flt_rule_hdl, 0, NUM_IPV6_PREFIX_FLT_RULE * sizeof(uint32_t)); - memset(ipv6_icmp_flt_rule_hdl, 0, NUM_IPV6_ICMP_FLT_RULE * sizeof(uint32_t)); - memset(ipv6_prefix, 0, sizeof(ipv6_prefix)); - - /* ODU routing table initilization */ - if(ipa_if_cate == ODU_IF) - { - /* only do one time ioctl to odu-driver to infrom in router or bridge mode*/ - if (IPACM_Lan::odu_up != true) - { - m_fd_odu = open(IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU, O_RDWR); - if (0 == m_fd_odu) - { - IPACMERR("Failed opening %s.\n", IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU); - return ; - } - - if(IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == true) - { - ret = ioctl(m_fd_odu, ODU_BRIDGE_IOC_SET_MODE, ODU_BRIDGE_MODE_ROUTER); - IPACM_Iface::ipacmcfg->ipacm_odu_enable = true; - } - else - { - ret = ioctl(m_fd_odu, ODU_BRIDGE_IOC_SET_MODE, ODU_BRIDGE_MODE_BRIDGE); - IPACM_Iface::ipacmcfg->ipacm_odu_enable = true; - } - - if (ret) - { - IPACMERR("Failed tell odu-driver the mode\n"); - } - IPACMDBG("Tell odu-driver in router-mode(%d)\n", IPACM_Iface::ipacmcfg->ipacm_odu_router_mode); - IPACMDBG_H("odu is up: odu-driver in router-mode(%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_router_mode); - close(m_fd_odu); - IPACM_Lan::odu_up = true; - } - } - - if(iface_query != NULL && tx_prop != NULL) - { - for(i=0; i<iface_query->num_tx_props; i++) - each_client_rt_rule_count[tx_prop->tx[i].ip]++; - } - IPACMDBG_H("Need to add %d IPv4 and %d IPv6 routing rules for eth bridge for each client.\n", each_client_rt_rule_count[IPA_IP_v4], each_client_rt_rule_count[IPA_IP_v6]); - -#ifdef FEATURE_IPA_ANDROID - /* set the IPA-client pipe enum */ - if(ipa_if_cate == LAN_IF) - { - handle_tethering_client(false, IPACM_CLIENT_USB); - } -#endif - return; -} - -IPACM_Lan::~IPACM_Lan() -{ - IPACM_EvtDispatcher::deregistr(this); - IPACM_IfaceManager::deregistr(this); - return; -} - - -/* LAN-iface's callback function */ -void IPACM_Lan::event_callback(ipa_cm_event_id event, void *param) -{ - if(is_active == false && event != IPA_LAN_DELETE_SELF) - { - IPACMDBG_H("The interface is no longer active, return.\n"); - return; - } - - int ipa_interface_index; - ipacm_ext_prop* ext_prop; - ipacm_event_iface_up* data_wan; - ipacm_event_iface_up_tehter* data_wan_tether; - - switch (event) - { - case IPA_LINK_DOWN_EVENT: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_LINK_DOWN_EVENT\n"); - handle_down_evt(); - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - return; - } - } - break; - - case IPA_CFG_CHANGE_EVENT: - { - if ( IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate) - { - IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT and category changed\n"); - /* delete previous instance */ - handle_down_evt(); - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - is_mode_switch = true; // need post internal usb-link up event - return; - } - /* Add Natting iface to IPACM_Config if there is Rx/Tx property */ - if (rx_prop != NULL || tx_prop != NULL) - { - IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name); - IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name); - } - } - break; - - case IPA_PRIVATE_SUBNET_CHANGE_EVENT: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - /* internel event: data->if_index is ipa_if_index */ - if (data->if_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from itself posting, ignore\n"); - return; - } - else - { - IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from other LAN iface \n"); -#ifdef FEATURE_IPA_ANDROID - handle_private_subnet_android(IPA_IP_v4); -#endif - IPACMDBG_H(" delete old private subnet rules, use new sets \n"); - return; - } - } - break; - - case IPA_LAN_DELETE_SELF: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - if(data->if_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_LAN_DELETE_SELF event.\n"); - IPACMDBG_H("ipa_LAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); - /* posting link-up event for cradle use-case */ - if(is_mode_switch) - { - IPACMDBG_H("Posting IPA_USB_LINK_UP_EVENT event for (%s)\n", dev_name); - ipacm_cmd_q_data evt_data; - memset(&evt_data, 0, sizeof(evt_data)); - - ipacm_event_data_fid *data_fid = NULL; - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for IPA_USB_LINK_UP_EVENT data_fid\n"); - return; - } - if(IPACM_Iface::ipa_get_if_index(dev_name, &(data_fid->if_index))) - { - IPACMERR("Error while getting interface index for %s device", dev_name); - } - evt_data.event = IPA_USB_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - //IPACMDBG_H("Posting event:%d\n", evt_data.event); - IPACM_EvtDispatcher::PostEvt(&evt_data); - } -#ifndef FEATURE_IPA_ANDROID - if(rx_prop != NULL) - { - if(IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4) != 0) - { - IPACMDBG_DMESG("### WARNING ### num ipv4 flt rules on client %d is not expected: %d expected value: 0", - rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4)); - } - if(IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6) != 0) - { - IPACMDBG_DMESG("### WARNING ### num ipv6 flt rules on client %d is not expected: %d expected value: 0", - rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6)); - } - } -#endif - delete this; - } - break; - } - - case IPA_ADDR_ADD_EVENT: - { - ipacm_event_data_addr *data = (ipacm_event_data_addr *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - - if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) || - (data->iptype == IPA_IP_v6 && - data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 && - data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) ) - { - IPACMDBG_H("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n"); - return; - } - - - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_ADDR_ADD_EVENT\n"); - - /* only call ioctl for ODU iface with bridge mode */ - if(IPACM_Iface::ipacmcfg->ipacm_odu_enable == true && IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == false - && ipa_if_cate == ODU_IF) - { - if((data->iptype == IPA_IP_v6) && (num_dft_rt_v6 == 0)) - { - handle_addr_evt_odu_bridge(data); - } -#ifdef FEATURE_IPA_ANDROID - add_dummy_private_subnet_flt_rule(data->iptype); - handle_private_subnet_android(data->iptype); -#else - handle_private_subnet(data->iptype); -#endif - } - else - { - - /* check v4 not setup before, v6 can have 2 iface ip */ - if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) - || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES))) - { - IPACMDBG_H("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6); - if(handle_addr_evt(data) == IPACM_FAILURE) - { - return; - } - -#ifdef FEATURE_IPA_ANDROID - add_dummy_private_subnet_flt_rule(data->iptype); - handle_private_subnet_android(data->iptype); -#else - handle_private_subnet(data->iptype); -#endif - - if (IPACM_Wan::isWanUP(ipa_if_num)) - { - if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX) - { - if(IPACM_Wan::backhaul_is_sta_mode == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4); - handle_wan_up_ex(ext_prop, IPA_IP_v4, - IPACM_Wan::getXlat_Mux_Id()); - } - else - { - handle_wan_up(IPA_IP_v4); - } - } - } - - if(IPACM_Wan::isWanUP_V6(ipa_if_num)) - { - if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1) - { - memcpy(ipv6_prefix, IPACM_Wan::backhaul_ipv6_prefix, sizeof(ipv6_prefix)); - install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix); - if(IPACM_Wan::backhaul_is_sta_mode == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6); - handle_wan_up_ex(ext_prop, IPA_IP_v6, 0); - } - else - { - handle_wan_up(IPA_IP_v6); - } - } - } - - /* Post event to NAT */ - if (data->iptype == IPA_IP_v4) - { - ipacm_cmd_q_data evt_data; - ipacm_event_iface_up *info; - - info = (ipacm_event_iface_up *) - malloc(sizeof(ipacm_event_iface_up)); - if (info == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - - memcpy(info->ifname, dev_name, IF_NAME_LEN); - info->ipv4_addr = data->ipv4_addr; - info->addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[0].subnet_mask; - - evt_data.event = IPA_HANDLE_LAN_UP; - evt_data.evt_data = (void *)info; - - /* Insert IPA_HANDLE_LAN_UP to command queue */ - IPACMDBG_H("posting IPA_HANDLE_LAN_UP for IPv4 with below information\n"); - IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n", - info->ipv4_addr, info->addr_mask); - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - IPACMDBG_H("Finish handling IPA_ADDR_ADD_EVENT for ip-family(%d)\n", data->iptype); - } - - IPACMDBG_H("Finish handling IPA_ADDR_ADD_EVENT for ip-family(%d)\n", data->iptype); - /* checking if SW-RT_enable */ - if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true) - { - /* handle software routing enable event*/ - IPACMDBG_H("IPA_SW_ROUTING_ENABLE for iface: %s \n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - handle_software_routing_enable(); - } - - } - } - } - break; -#ifdef FEATURE_IPA_ANDROID - case IPA_HANDLE_WAN_UP_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP_TETHER event\n"); - - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - if(data_wan_tether->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4); - handle_wan_up_ex(ext_prop, IPA_IP_v4, 0); - } - else - { - handle_wan_up(IPA_IP_v4); - } - } - } - break; - - case IPA_HANDLE_WAN_UP_V6_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6_TETHER event\n"); - - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix)); - install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix); - if(data_wan_tether->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6); - handle_wan_up_ex(ext_prop, IPA_IP_v6, 0); - } - else - { - handle_wan_up(IPA_IP_v6); - } - } - } - break; - - case IPA_HANDLE_WAN_DOWN_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_TETHER event\n"); - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - handle_wan_down(data_wan_tether->is_sta); - } - } - break; - - case IPA_HANDLE_WAN_DOWN_V6_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER event\n"); - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - /* clean up v6 RT rules*/ - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER in LAN-instance and need clean up client IPv6 address \n"); - /* reset usb-client ipv6 rt-rules */ - handle_lan_client_reset_rt(IPA_IP_v6); - - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - handle_wan_down_v6(data_wan_tether->is_sta); - } - } - break; -#else - case IPA_HANDLE_WAN_UP: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n"); - - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - if(data_wan->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4); - handle_wan_up_ex(ext_prop, IPA_IP_v4, data_wan->xlat_mux_id); - } - else - { - handle_wan_up(IPA_IP_v4); - } - } - break; - - case IPA_HANDLE_WAN_UP_V6: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6 event\n"); - - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - memcpy(ipv6_prefix, data_wan->ipv6_prefix, sizeof(ipv6_prefix)); - install_ipv6_prefix_flt_rule(data_wan->ipv6_prefix); - if(data_wan->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6); - handle_wan_up_ex(ext_prop, IPA_IP_v6, 0); - } - else - { - handle_wan_up(IPA_IP_v6); - } - } - break; - - case IPA_HANDLE_WAN_DOWN: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN event\n"); - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - handle_wan_down(data_wan->is_sta); - } - break; - - case IPA_HANDLE_WAN_DOWN_V6: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6 event\n"); - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - /* clean up v6 RT rules*/ - IPACMDBG_H("Received IPA_WAN_V6_DOWN in LAN-instance and need clean up client IPv6 address \n"); - /* reset usb-client ipv6 rt-rules */ - handle_lan_client_reset_rt(IPA_IP_v6); - - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - handle_wan_down_v6(data_wan->is_sta); - } - break; -#endif - - case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT: - { - ipacm_event_data_all *data = (ipacm_event_data_all *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - IPACMDBG_H("Recieved IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT event \n"); - IPACMDBG_H("check iface %s category: %d\n", dev_name, ipa_if_cate); - - if (ipa_interface_index == ipa_if_num && ipa_if_cate == ODU_IF) - { - IPACMDBG_H("ODU iface got v4-ip \n"); - /* first construc ODU full header */ - if ((ipv4_header_set == false) && (ipv6_header_set == false)) - { - /* construct ODU RT tbl */ - handle_odu_hdr_init(data->mac_addr); - if (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true) - { - handle_odu_route_add(); - IPACMDBG_H("construct ODU header and route rules, embms_flag (%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable); - } - else - { - IPACMDBG_H("construct ODU header only, embms_flag (%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable); - } - } - /* if ODU in bridge mode, directly return */ - if(IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == false) - { - IPACMDBG_H("ODU is in bridge mode, no action \n"); - return; - } - } - - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("ETH iface got client \n"); - /* first construc ETH full header */ - handle_eth_hdr_init(data->mac_addr); - IPACMDBG_H("construct ETH header and route rules \n"); - /* Associate with IP and construct RT-rule */ - if (handle_eth_client_ipaddr(data) == IPACM_FAILURE) - { - return; - } - handle_eth_client_route_rule(data->mac_addr, data->iptype); - if (data->iptype == IPA_IP_v4) - { - /* Add NAT rules after ipv4 RT rules are set */ - CtList->HandleNeighIpAddrAddEvt(data); - } - eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->mac_addr); - return; - } - } - break; - - case IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT: - { - ipacm_event_data_all *data = (ipacm_event_data_all *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - - IPACMDBG_H("Received IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT event. \n"); - IPACMDBG_H("check iface %s category: %d\n", dev_name, ipa_if_cate); - /* if ODU in bridge mode, directly return */ - if (ipa_if_cate == ODU_IF && IPACM_Iface::ipacmcfg->ipacm_odu_router_mode == false) - { - IPACMDBG_H("ODU is in bridge mode, no action \n"); - return; - } - - if (ipa_interface_index == ipa_if_num) - { - if (data->iptype == IPA_IP_v6) - { - handle_del_ipv6_addr(data); - return; - } - - eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_DEL, IPA_IP_MAX, data->mac_addr); - - IPACMDBG_H("LAN iface delete client \n"); - handle_eth_client_down_evt(data->mac_addr); - return; - } - } - break; - - case IPA_SW_ROUTING_ENABLE: - IPACMDBG_H("Received IPA_SW_ROUTING_ENABLE\n"); - /* handle software routing enable event*/ - handle_software_routing_enable(); - break; - - case IPA_SW_ROUTING_DISABLE: - IPACMDBG_H("Received IPA_SW_ROUTING_DISABLE\n"); - /* handle software routing disable event*/ - handle_software_routing_disable(); - break; - - case IPA_CRADLE_WAN_MODE_SWITCH: - { - IPACMDBG_H("Received IPA_CRADLE_WAN_MODE_SWITCH event.\n"); - ipacm_event_cradle_wan_mode* wan_mode = (ipacm_event_cradle_wan_mode*)param; - if(wan_mode == NULL) - { - IPACMERR("Event data is empty.\n"); - return; - } - - if(wan_mode->cradle_wan_mode == BRIDGE) - { - handle_cradle_wan_mode_switch(true); - } - else - { - handle_cradle_wan_mode_switch(false); - } - } - break; - - case IPA_TETHERING_STATS_UPDATE_EVENT: - { - IPACMDBG_H("Received IPA_TETHERING_STATS_UPDATE_EVENT event.\n"); - if (IPACM_Wan::isWanUP(ipa_if_num) || IPACM_Wan::isWanUP_V6(ipa_if_num)) - { - if(IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */ - { - ipa_get_data_stats_resp_msg_v01 *data = (ipa_get_data_stats_resp_msg_v01 *)param; - IPACMDBG("Received IPA_TETHERING_STATS_UPDATE_STATS ipa_stats_type: %d\n",data->ipa_stats_type); - IPACMDBG("Received %d UL, %d DL pipe stats\n",data->ul_src_pipe_stats_list_len, - data->dl_dst_pipe_stats_list_len); - if (data->ipa_stats_type != QMI_IPA_STATS_TYPE_PIPE_V01) - { - IPACMERR("not valid pipe stats enum(%d)\n", data->ipa_stats_type); - return; - } - handle_tethering_stats_event(data); - } - } - } - break; - - default: - break; - } - - return; -} - - -int IPACM_Lan::handle_del_ipv6_addr(ipacm_event_data_all *data) -{ - uint32_t tx_index; - uint32_t rt_hdl; - int num_v6 =0, clnt_indx; - - clnt_indx = get_eth_client_index(data->mac_addr); - if (clnt_indx == IPACM_INVALID_INDEX) - { - IPACMERR("eth client not found/attached \n"); - return IPACM_FAILURE; - } - - if(data->iptype == IPA_IP_v6) - { - if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) - { - IPACMDBG_H("ipv6 address got: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); - for(num_v6=0;num_v6 < get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++) - { - if( data->ipv6_addr[0] == get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][0] && - data->ipv6_addr[1] == get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][1] && - data->ipv6_addr[2]== get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][2] && - data->ipv6_addr[3] == get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][3]) - { - IPACMDBG_H("ipv6 addr is found at position:%d for client:%d\n", num_v6, clnt_indx); - break; - } - } - } - if (num_v6 == IPV6_NUM_ADDR) - { - IPACMDBG_H("ipv6 addr is not found. \n"); - return IPACM_FAILURE; - } - - for(tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if((tx_prop->tx[tx_index].ip == IPA_IP_v6) && (get_client_memptr(eth_client, clnt_indx)->route_rule_set_v6 != 0)) - { - IPACMDBG_H("Delete client index %d ipv6 RT-rules for %d-st ipv6 for tx:%d\n", clnt_indx, num_v6, tx_index); - rt_hdl = get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - rt_hdl = get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6]; - if(m_routing.DeleteRoutingHdl(rt_hdl, IPA_IP_v6) == false) - { - return IPACM_FAILURE; - } - get_client_memptr(eth_client, clnt_indx)->ipv6_set--; - get_client_memptr(eth_client, clnt_indx)->route_rule_set_v6--; - - for(num_v6;num_v6< get_client_memptr(eth_client, clnt_indx)->ipv6_set;num_v6++) - { - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][0] = - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][0]; - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][1] = - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][1]; - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][2] = - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][2]; - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6][3] = - get_client_memptr(eth_client, clnt_indx)->v6_addr[num_v6+1][3]; - get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6] = - get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6+1]; - get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6] = - get_client_memptr(eth_client, clnt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6+1]; - } - } - } - } - return IPACM_SUCCESS; -} - -/* delete filter rule for wan_down event for IPv4*/ -int IPACM_Lan::handle_wan_down(bool is_sta_mode) -{ - ipa_fltr_installed_notif_req_msg_v01 flt_index; - int fd; - - fd = open(IPA_DEVICE_NAME, O_RDWR); - if (0 == fd) - { - IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); - return IPACM_FAILURE; - } - - if(is_sta_mode == false) - { - if (num_wan_ul_fl_rule_v4 > MAX_WAN_UL_FILTER_RULES) - { - IPACMERR("number of wan_ul_fl_rule_v4 (%d) > MAX_WAN_UL_FILTER_RULES (%d), aborting...\n", num_wan_ul_fl_rule_v4, MAX_WAN_UL_FILTER_RULES); - close(fd); - return IPACM_FAILURE; - } - if (m_filtering.DeleteFilteringHdls(wan_ul_fl_rule_hdl_v4, - IPA_IP_v4, num_wan_ul_fl_rule_v4) == false) - { - IPACMERR("Error Deleting RuleTable(1) to Filtering, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_wan_ul_fl_rule_v4); - - memset(wan_ul_fl_rule_hdl_v4, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t)); - num_wan_ul_fl_rule_v4 = 0; - modem_ul_v4_set = false; - - memset(&flt_index, 0, sizeof(flt_index)); - flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe); - flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01; -#ifndef FEATURE_IPA_V3 - flt_index.filter_index_list_len = 0; -#else /* defined (FEATURE_IPA_V3) */ - flt_index.rule_id_valid = 1; - flt_index.rule_id_len = 0; -#endif - flt_index.embedded_pipe_index_valid = 1; - flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD); - flt_index.retain_header_valid = 1; - flt_index.retain_header = 0; - flt_index.embedded_call_mux_id_valid = 1; - flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); - - if(false == m_filtering.SendFilteringRuleIndex(&flt_index)) - { - IPACMERR("Error sending filtering rule index, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - } - else - { - if (m_filtering.DeleteFilteringHdls(&lan_wan_fl_rule_hdl[0], IPA_IP_v4, 1) == false) - { - IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - } - - close(fd); - return IPACM_SUCCESS; -} - -/* handle new_address event*/ -int IPACM_Lan::handle_addr_evt(ipacm_event_data_addr *data) -{ - struct ipa_ioc_add_rt_rule *rt_rule; - struct ipa_rt_rule_add *rt_rule_entry; - const int NUM_RULES = 1; - int num_ipv6_addr; - int res = IPACM_SUCCESS; - - IPACMDBG_H("set route/filter rule ip-type: %d \n", data->iptype); - -/* Add private subnet*/ -#ifdef FEATURE_IPA_ANDROID - if (data->iptype == IPA_IP_v4) - { - IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet); - if_ipv4_subnet = (data->ipv4_addr >> 8) << 8; - IPACMDBG_H(" Add IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet); - if(IPACM_Iface::ipacmcfg->AddPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false) - { - IPACMERR(" can't Add IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet); - } - } -#endif /* defined(FEATURE_IPA_ANDROID)*/ - - /* Update the IP Type. */ - config_ip_type(data->iptype); - - if (data->iptype == IPA_IP_v4) - { - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM_RULES * sizeof(struct ipa_rt_rule_add)); - - if (!rt_rule) - { - IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = NUM_RULES; - rt_rule->ip = data->iptype; - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = false; - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; //go to A5 - rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (rt_rule_entry->status) - { - IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); - res = rt_rule_entry->status; - goto fail; - } - dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("ipv4 iface rt-rule hdl1=0x%x\n", dft_rt_rule_hdl[0]); - /* initial multicast/broadcast/fragment filter rule */ - - init_fl_rule(data->iptype); - install_ipv4_icmp_flt_rule(); - - /* populate the flt rule offset for eth bridge */ - eth_bridge_flt_rule_offset[data->iptype] = ipv4_icmp_flt_rule_hdl[0]; - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v4, NULL); - } - else - { - /* check if see that v6-addr already or not*/ - for(num_ipv6_addr=0;num_ipv6_addr<num_dft_rt_v6;num_ipv6_addr++) - { - if((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) && - (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) && - (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) && - (ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3])) - { - return IPACM_FAILURE; - break; - } - } - - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM_RULES * sizeof(struct ipa_rt_rule_add)); - - if (!rt_rule) - { - IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = NUM_RULES; - rt_rule->ip = data->iptype; - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name)); - - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = false; - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; //go to A5 - rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; - ipv6_addr[num_dft_rt_v6][0] = data->ipv6_addr[0]; - ipv6_addr[num_dft_rt_v6][1] = data->ipv6_addr[1]; - ipv6_addr[num_dft_rt_v6][2] = data->ipv6_addr[2]; - ipv6_addr[num_dft_rt_v6][3] = data->ipv6_addr[3]; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (rt_rule_entry->status) - { - IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); - res = rt_rule_entry->status; - goto fail; - } - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl; - - /* setup same rule for v6_wan table*/ - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name)); - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (rt_rule_entry->status) - { - IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); - res = rt_rule_entry->status; - goto fail; - } - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1] = rt_rule_entry->rt_rule_hdl; - - IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n", - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6], - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1],num_dft_rt_v6); - - if (num_dft_rt_v6 == 0) - { - install_ipv6_icmp_flt_rule(); - - /* populate the flt rule offset for eth bridge */ - eth_bridge_flt_rule_offset[data->iptype] = ipv6_icmp_flt_rule_hdl[0]; - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v6, NULL); - - init_fl_rule(data->iptype); - } - num_dft_rt_v6++; - IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6); - } - - IPACMDBG_H("finish route/filter rule ip-type: %d, res(%d)\n", data->iptype, res); - -fail: - free(rt_rule); - return res; -} - -/* configure private subnet filter rules*/ -int IPACM_Lan::handle_private_subnet(ipa_ip_type iptype) -{ - struct ipa_flt_rule_add flt_rule_entry; - int i; - - ipa_ioc_add_flt_rule *m_pFilteringTable; - - IPACMDBG_H("lan->handle_private_subnet(); set route/filter rule \n"); - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if (iptype == IPA_IP_v4) - { - - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *) - calloc(1, - sizeof(struct ipa_ioc_add_flt_rule) + - (IPACM_Iface::ipacmcfg->ipa_num_private_subnet) * sizeof(struct ipa_flt_rule_add) - ); - if (!m_pFilteringTable) - { - PERROR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v4; - m_pFilteringTable->num_rules = (uint8_t)IPACM_Iface::ipacmcfg->ipa_num_private_subnet; - - /* Make LAN-traffic always go A5, use default IPA-RT table */ - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4)) - { - IPACMERR("LAN m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_default_v4); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - - for (i = 0; i < (IPACM_Iface::ipacmcfg->ipa_num_private_subnet); i++) - { - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - /* Support private subnet feature including guest-AP can't talk to primary AP etc */ - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl; - IPACMDBG_H(" private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name); - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_mask; - flt_rule_entry.rule.attrib.u.v4.dst_addr = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_addr; - memcpy(&(m_pFilteringTable->rules[i]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACMDBG_H("Loop %d 5\n", i); - } - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPACM_Iface::ipacmcfg->ipa_num_private_subnet); - - /* copy filter rule hdls */ - for (i = 0; i < IPACM_Iface::ipacmcfg->ipa_num_private_subnet; i++) - { - private_fl_rule_hdl[i] = m_pFilteringTable->rules[i].flt_rule_hdl; - } - free(m_pFilteringTable); - } - else - { - IPACMDBG_H("No private subnet rules for ipv6 iface %s\n", dev_name); - } - return IPACM_SUCCESS; -} - - -/* for STA mode wan up: configure filter rule for wan_up event*/ -int IPACM_Lan::handle_wan_up(ipa_ip_type ip_type) -{ - struct ipa_flt_rule_add flt_rule_entry; - int len = 0; - ipa_ioc_add_flt_rule *m_pFilteringTable; - - IPACMDBG_H("set WAN interface as default filter rule\n"); - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if(ip_type == IPA_IP_v4) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + (1 * sizeof(struct ipa_flt_rule_add)); - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (m_pFilteringTable == NULL) - { - PERROR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v4; - m_pFilteringTable->num_rules = (uint8_t)1; - - IPACMDBG_H("Retrieving routing hanle for table: %s\n", - IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name); - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4)) - { - IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4=0x%p) Failed.\n", - &IPACM_Iface::ipacmcfg->rt_tbl_wan_v4); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - IPACMDBG_H("Routing hanle for table: %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl); - - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); // Zero All Fields - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - if(IPACM_Wan::isWan_Bridge_Mode()) - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT; //IPA_PASS_TO_ROUTING - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl; - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x0; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x0; - - memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry)); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", - m_pFilteringTable->rules[0].flt_rule_hdl, - m_pFilteringTable->rules[0].status); - } - - - /* copy filter hdls */ - lan_wan_fl_rule_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl; - free(m_pFilteringTable); - } - else if(ip_type == IPA_IP_v6) - { - /* add default v6 filter rule */ - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_flt_rule) + - 1 * sizeof(struct ipa_flt_rule_add)); - - if (!m_pFilteringTable) - { - PERROR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v6; - m_pFilteringTable->num_rules = (uint8_t)1; - - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6)) - { - IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_v6=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_v6); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_v6.hdl; - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; - - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - - /* copy filter hdls */ - dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES] = m_pFilteringTable->rules[0].flt_rule_hdl; - free(m_pFilteringTable); - } - - return IPACM_SUCCESS; -} - -int IPACM_Lan::handle_wan_up_ex(ipacm_ext_prop *ext_prop, ipa_ip_type iptype, uint8_t xlat_mux_id) -{ - int fd, ret = IPACM_SUCCESS, cnt; - IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg; - struct ipa_ioc_write_qmapid mux; - - if(rx_prop != NULL) - { - /* give mud ID to IPA-driver for WLAN/LAN pkts */ - fd = open(IPA_DEVICE_NAME, O_RDWR); - if (0 == fd) - { - IPACMDBG_H("Failed opening %s.\n", IPA_DEVICE_NAME); - return IPACM_FAILURE; - } - - mux.qmap_id = ipacm_config->GetQmapId(); - for(cnt=0; cnt<rx_prop->num_rx_props; cnt++) - { - mux.client = rx_prop->rx[cnt].src_pipe; - ret = ioctl(fd, IPA_IOC_WRITE_QMAPID, &mux); - if (ret) - { - IPACMERR("Failed to write mux id %d\n", mux.qmap_id); - close(fd); - return IPACM_FAILURE; - } - } - close(fd); - } - - /* check only add static UL filter rule once */ - if (num_dft_rt_v6 ==1 && iptype ==IPA_IP_v6 && modem_ul_v6_set == false) - { - IPACMDBG_H("IPA_IP_v6 num_dft_rt_v6 %d xlat_mux_id: %d modem_ul_v6_set: %d\n", num_dft_rt_v6, xlat_mux_id, modem_ul_v6_set); - ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id); - modem_ul_v6_set = true; - } else if (iptype ==IPA_IP_v4 && modem_ul_v4_set == false) { - IPACMDBG_H("IPA_IP_v4 xlat_mux_id: %d, modem_ul_v4_set %d\n", xlat_mux_id, modem_ul_v4_set); - ret = handle_uplink_filter_rule(ext_prop, iptype, xlat_mux_id); - modem_ul_v4_set = true; - } else { - IPACMDBG_H("ip-type: %d modem_ul_v4_set: %d, modem_ul_v6_set %d\n", iptype, modem_ul_v4_set, modem_ul_v6_set); - } - return ret; -} - -/* handle ETH client initial, construct full headers (tx property) */ -int IPACM_Lan::handle_eth_hdr_init(uint8_t *mac_addr) -{ - -#define ETH_IFACE_INDEX_LEN 2 - - int res = IPACM_SUCCESS, len = 0; - char index[ETH_IFACE_INDEX_LEN]; - struct ipa_ioc_copy_hdr sCopyHeader; - struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL; - uint32_t cnt; - int clnt_indx; - - clnt_indx = get_eth_client_index(mac_addr); - - if (clnt_indx != IPACM_INVALID_INDEX) - { - IPACMERR("eth client is found/attached already with index %d \n", clnt_indx); - return IPACM_FAILURE; - } - - /* add header to IPA */ - if (num_eth_client >= IPA_MAX_NUM_ETH_CLIENTS) - { - IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_ETH_CLIENTS); - return IPACM_FAILURE; - } - - IPACMDBG_H("ETH client number: %d\n", num_eth_client); - - memcpy(get_client_memptr(eth_client, num_eth_client)->mac, - mac_addr, - sizeof(get_client_memptr(eth_client, num_eth_client)->mac)); - - - IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(eth_client, num_eth_client)->mac[0], - get_client_memptr(eth_client, num_eth_client)->mac[1], - get_client_memptr(eth_client, num_eth_client)->mac[2], - get_client_memptr(eth_client, num_eth_client)->mac[3], - get_client_memptr(eth_client, num_eth_client)->mac[4], - get_client_memptr(eth_client, num_eth_client)->mac[5]); - - /* add header to IPA */ - if(tx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add)); - pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len); - if (pHeaderDescriptor == NULL) - { - IPACMERR("calloc failed to allocate pHeaderDescriptor\n"); - return IPACM_FAILURE; - } - - /* copy partial header for v4*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v4) - { - IPACMDBG_H("Got partial v4-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - /* copy client mac_addr to partial header */ - if (sCopyHeader.is_eth2_ofst_valid) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst], - mac_addr, - IPA_MAC_ADDR_SIZE); - } - /* replace src mac to bridge mac_addr if any */ - if (IPACM_Iface::ipacmcfg->ipa_bridge_enable) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE], - IPACM_Iface::ipacmcfg->bridge_mac, - IPA_MAC_ADDR_SIZE); - IPACMDBG_H("device is in bridge mode \n"); - } - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - snprintf(index,sizeof(index), "%d", header_name_count); - if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl; - IPACMDBG_H("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n", - num_eth_client, - pHeaderDescriptor->hdr[0].name, - get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v4); - get_client_memptr(eth_client, num_eth_client)->ipv4_header_set=true; - - break; - } - } - - - /* copy partial header for v6*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v6) - { - - IPACMDBG_H("Got partial v6-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - /* copy client mac_addr to partial header */ - if (sCopyHeader.is_eth2_ofst_valid) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst], - mac_addr, - IPA_MAC_ADDR_SIZE); - } - /* replace src mac to bridge mac_addr if any */ - if (IPACM_Iface::ipacmcfg->ipa_bridge_enable) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE], - IPACM_Iface::ipacmcfg->bridge_mac, - IPA_MAC_ADDR_SIZE); - IPACMDBG_H("device is in bridge mode \n"); - } - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_ETH_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - snprintf(index,sizeof(index), "%d", header_name_count); - if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl; - IPACMDBG_H("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n", - num_eth_client, - pHeaderDescriptor->hdr[0].name, - get_client_memptr(eth_client, num_eth_client)->hdr_hdl_v6); - - get_client_memptr(eth_client, num_eth_client)->ipv6_header_set=true; - - break; - - } - } - /* initialize wifi client*/ - get_client_memptr(eth_client, num_eth_client)->route_rule_set_v4 = false; - get_client_memptr(eth_client, num_eth_client)->route_rule_set_v6 = 0; - get_client_memptr(eth_client, num_eth_client)->ipv4_set = false; - get_client_memptr(eth_client, num_eth_client)->ipv6_set = 0; - num_eth_client++; - header_name_count++; //keep increasing header_name_count - res = IPACM_SUCCESS; - IPACMDBG_H("eth client number: %d\n", num_eth_client); - } - else - { - return res; - } -fail: - free(pHeaderDescriptor); - return res; -} - -/*handle eth client */ -int IPACM_Lan::handle_eth_client_ipaddr(ipacm_event_data_all *data) -{ - int clnt_indx; - int v6_num; - uint32_t ipv6_link_local_prefix = 0xFE800000; - uint32_t ipv6_link_local_prefix_mask = 0xFFC00000; - - IPACMDBG_H("number of eth clients: %d\n", num_eth_client); - IPACMDBG_H("event MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - data->mac_addr[0], - data->mac_addr[1], - data->mac_addr[2], - data->mac_addr[3], - data->mac_addr[4], - data->mac_addr[5]); - - clnt_indx = get_eth_client_index(data->mac_addr); - - if (clnt_indx == IPACM_INVALID_INDEX) - { - IPACMERR("eth client not found/attached \n"); - return IPACM_FAILURE; - } - - IPACMDBG_H("Ip-type received %d\n", data->iptype); - if (data->iptype == IPA_IP_v4) - { - IPACMDBG_H("ipv4 address: 0x%x\n", data->ipv4_addr); - if (data->ipv4_addr != 0) /* not 0.0.0.0 */ - { - if (get_client_memptr(eth_client, clnt_indx)->ipv4_set == false) - { - get_client_memptr(eth_client, clnt_indx)->v4_addr = data->ipv4_addr; - get_client_memptr(eth_client, clnt_indx)->ipv4_set = true; - } - else - { - /* check if client got new IPv4 address*/ - if(data->ipv4_addr == get_client_memptr(eth_client, clnt_indx)->v4_addr) - { - IPACMDBG_H("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx); - return IPACM_FAILURE; - } - else - { - IPACMDBG_H("ipv4 addr for client:%d is changed \n", clnt_indx); - /* delete NAT rules first */ - CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, clnt_indx)->v4_addr); - delete_eth_rtrules(clnt_indx,IPA_IP_v4); - get_client_memptr(eth_client, clnt_indx)->route_rule_set_v4 = false; - get_client_memptr(eth_client, clnt_indx)->v4_addr = data->ipv4_addr; - } - } - } - else - { - IPACMDBG_H("Invalid client IPv4 address \n"); - return IPACM_FAILURE; - } - } - else - { - if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */ - { - IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); - if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) && - memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0) - { - IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n"); - return IPACM_FAILURE; - } - - if(get_client_memptr(eth_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR) - { - - for(v6_num=0;v6_num < get_client_memptr(eth_client, clnt_indx)->ipv6_set;v6_num++) - { - if( data->ipv6_addr[0] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][0] && - data->ipv6_addr[1] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][1] && - data->ipv6_addr[2]== get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][2] && - data->ipv6_addr[3] == get_client_memptr(eth_client, clnt_indx)->v6_addr[v6_num][3]) - { - IPACMDBG_H("Already see this ipv6 addr at position: %d for client:%d\n", v6_num, clnt_indx); - return IPACM_FAILURE; /* not setup the RT rules*/ - } - } - - /* not see this ipv6 before for wifi client*/ - get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0]; - get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1]; - get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2]; - get_client_memptr(eth_client, clnt_indx)->v6_addr[get_client_memptr(eth_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3]; - get_client_memptr(eth_client, clnt_indx)->ipv6_set++; - } - else - { - IPACMDBG_H("Already got %d ipv6 addr for client:%d\n", IPV6_NUM_ADDR, clnt_indx); - return IPACM_FAILURE; /* not setup the RT rules*/ - } - } - } - - return IPACM_SUCCESS; -} - -/*handle eth client routing rule*/ -int IPACM_Lan::handle_eth_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype) -{ - struct ipa_ioc_add_rt_rule *rt_rule; - struct ipa_rt_rule_add *rt_rule_entry; - uint32_t tx_index; - int eth_index,v6_num; - const int NUM = 1; - char cmd[200] = {0}; - uint32_t ipv4_addr; - - if(tx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - IPACMDBG_H("Received mac_addr MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - eth_index = get_eth_client_index(mac_addr); - if (eth_index == IPACM_INVALID_INDEX) - { - IPACMDBG_H("eth client not found/attached \n"); - return IPACM_SUCCESS; - } - - if (iptype==IPA_IP_v4) { - IPACMDBG_H("eth client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", eth_index, iptype, - get_client_memptr(eth_client, eth_index)->ipv4_set, - get_client_memptr(eth_client, eth_index)->route_rule_set_v4); - } else { - IPACMDBG_H("eth client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", eth_index, iptype, - get_client_memptr(eth_client, eth_index)->ipv6_set, - get_client_memptr(eth_client, eth_index)->route_rule_set_v6); - } - /* Add default routing rules if not set yet */ - if ((iptype == IPA_IP_v4 - && get_client_memptr(eth_client, eth_index)->route_rule_set_v4 == false - && get_client_memptr(eth_client, eth_index)->ipv4_set == true) - || (iptype == IPA_IP_v6 - && get_client_memptr(eth_client, eth_index)->route_rule_set_v6 < get_client_memptr(eth_client, eth_index)->ipv6_set - )) - { - - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) - { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); - } - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_add)); - - if (rt_rule == NULL) - { - PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = (uint8_t)NUM; - rt_rule->ip = iptype; - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if(iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n", - tx_index, tx_prop->tx[tx_index].ip,iptype); - continue; - } - - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = 0; - - if (iptype == IPA_IP_v4) - { - IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", eth_index, - get_client_memptr(eth_client, eth_index)->v4_addr); - - IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n", - eth_index, - get_client_memptr(eth_client, eth_index)->hdr_hdl_v4); - - /* add static arp entry */ - ipv4_addr = get_client_memptr(eth_client, eth_index)->v4_addr; - snprintf(cmd, sizeof(cmd), "ip neighbor change %d.%d.%d.%d lladdr %02x:%02x:%02x:%02x:%02x:%02x dev %s nud permanent", - (unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16), - (unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, - mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5], - dev_name); - IPACMDBG_H("%s\n", cmd); - system(cmd); - - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v4; - rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(eth_client, eth_index)->v4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - /* copy ipv4 RT hdl */ - get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4 = - rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4, iptype); - - } else { - - for(v6_num = get_client_memptr(eth_client, eth_index)->route_rule_set_v6;v6_num < get_client_memptr(eth_client, eth_index)->ipv6_set;v6_num++) - { - IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n", - eth_index, - get_client_memptr(eth_client, eth_index)->hdr_hdl_v6); - - /* v6 LAN_RT_TBL */ - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_v6.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - /* Support QCMAP LAN traffic feature, send to A5 */ - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; - memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.hdr_hdl = 0; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[v6_num], iptype); - - /*Copy same rule to v6 WAN RT TBL*/ - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - /* Downlink traffic from Wan iface, directly through IPA */ - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.hdr_hdl = get_client_memptr(eth_client, eth_index)->hdr_hdl_v6; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(eth_client, eth_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(eth_client, eth_index)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[v6_num], iptype); - } - } - - } /* end of for loop */ - - free(rt_rule); - - if (iptype == IPA_IP_v4) - { - get_client_memptr(eth_client, eth_index)->route_rule_set_v4 = true; - } - else - { - get_client_memptr(eth_client, eth_index)->route_rule_set_v6 = get_client_memptr(eth_client, eth_index)->ipv6_set; - } - } - return IPACM_SUCCESS; -} - -/* handle odu client initial, construct full headers (tx property) */ -int IPACM_Lan::handle_odu_hdr_init(uint8_t *mac_addr) -{ - int res = IPACM_SUCCESS, len = 0; - struct ipa_ioc_copy_hdr sCopyHeader; - struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL; - uint32_t cnt; - - IPACMDBG("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - /* add header to IPA */ - if(tx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add)); - pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len); - if (pHeaderDescriptor == NULL) - { - IPACMERR("calloc failed to allocate pHeaderDescriptor\n"); - return IPACM_FAILURE; - } - - /* copy partial header for v4*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v4) - { - IPACMDBG("Got partial v4-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - IPACMDBG("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - /* copy client mac_addr to partial header */ - if (sCopyHeader.is_eth2_ofst_valid) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst], - mac_addr, - IPA_MAC_ADDR_SIZE); - } - /* replace src mac to bridge mac_addr if any */ - if (IPACM_Iface::ipacmcfg->ipa_bridge_enable) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE], - IPACM_Iface::ipacmcfg->bridge_mac, - IPA_MAC_ADDR_SIZE); - IPACMDBG_H("device is in bridge mode \n"); - } - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - strlcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - ODU_hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl; - ipv4_header_set = true ; - IPACMDBG(" ODU v4 full header name:%s header handle:(0x%x)\n", - pHeaderDescriptor->hdr[0].name, - ODU_hdr_hdl_v4); - break; - } - } - - - /* copy partial header for v6*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v6) - { - - IPACMDBG("Got partial v6-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - /* copy client mac_addr to partial header */ - if (sCopyHeader.is_eth2_ofst_valid) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst], - mac_addr, - IPA_MAC_ADDR_SIZE); - } - /* replace src mac to bridge mac_addr if any */ - if (IPACM_Iface::ipacmcfg->ipa_bridge_enable) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE], - IPACM_Iface::ipacmcfg->bridge_mac, - IPA_MAC_ADDR_SIZE); - IPACMDBG_H("device is in bridge mode \n"); - } - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - strlcpy(pHeaderDescriptor->hdr[0].name, IPA_ODU_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - ODU_hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl; - ipv6_header_set = true ; - IPACMDBG(" ODU v4 full header name:%s header handle:(0x%x)\n", - pHeaderDescriptor->hdr[0].name, - ODU_hdr_hdl_v6); - break; - } - } - } -fail: - free(pHeaderDescriptor); - return res; -} - - -/* handle odu default route rule configuration */ -int IPACM_Lan::handle_odu_route_add() -{ - /* add default WAN route */ - struct ipa_ioc_add_rt_rule *rt_rule; - struct ipa_rt_rule_add *rt_rule_entry; - uint32_t tx_index; - const int NUM = 1; - - if(tx_prop == NULL) - { - IPACMDBG_H("No tx properties, ignore default route setting\n"); - return IPACM_SUCCESS; - } - - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_add)); - - if (!rt_rule) - { - IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = (uint8_t)NUM; - - - IPACMDBG_H("WAN table created %s \n", rt_rule->rt_tbl_name); - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = true; - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - - if (IPA_IP_v4 == tx_prop->tx[tx_index].ip) - { - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v4.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.hdr_hdl = ODU_hdr_hdl_v4; - rt_rule->ip = IPA_IP_v4; - } - else - { - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v6.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.hdr_hdl = ODU_hdr_hdl_v6; - rt_rule->ip = IPA_IP_v6; - } - - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - if (IPA_IP_v4 == tx_prop->tx[tx_index].ip) - { - rt_rule_entry->rule.attrib.u.v4.dst_addr = 0; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - odu_route_rule_v4_hdl[tx_index] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("Got ipv4 ODU-route rule hdl:0x%x,tx:%d,ip-type: %d \n", - odu_route_rule_v4_hdl[tx_index], - tx_index, - IPA_IP_v4); - } - else - { - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - odu_route_rule_v6_hdl[tx_index] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("Set ipv6 ODU-route rule hdl for v6_lan_table:0x%x,tx:%d,ip-type: %d \n", - odu_route_rule_v6_hdl[tx_index], - tx_index, - IPA_IP_v6); - } - } - free(rt_rule); - return IPACM_SUCCESS; -} - -/* handle odu default route rule deletion */ -int IPACM_Lan::handle_odu_route_del() -{ - uint32_t tx_index; - - if(tx_prop == NULL) - { - IPACMDBG_H("No tx properties, ignore delete default route setting\n"); - return IPACM_SUCCESS; - } - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if (tx_prop->tx[tx_index].ip == IPA_IP_v4) - { - IPACMDBG_H("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", - tx_index, tx_prop->tx[tx_index].ip,IPA_IP_v4); - - if (m_routing.DeleteRoutingHdl(odu_route_rule_v4_hdl[tx_index], IPA_IP_v4) - == false) - { - IPACMERR("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v4, odu_route_rule_v4_hdl[tx_index], tx_index); - return IPACM_FAILURE; - } - } - else - { - IPACMDBG_H("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", - tx_index, tx_prop->tx[tx_index].ip,IPA_IP_v6); - - if (m_routing.DeleteRoutingHdl(odu_route_rule_v6_hdl[tx_index], IPA_IP_v6) - == false) - { - IPACMERR("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, odu_route_rule_v6_hdl[tx_index], tx_index); - return IPACM_FAILURE; - } - } - } - - return IPACM_SUCCESS; -} - -/*handle eth client del mode*/ -int IPACM_Lan::handle_eth_client_down_evt(uint8_t *mac_addr) -{ - int clt_indx; - uint32_t tx_index; - int num_eth_client_tmp = num_eth_client; - int num_v6; - char cmd[200] = {0}; - uint32_t ipv4_addr; - - IPACMDBG_H("total client: %d\n", num_eth_client_tmp); - - clt_indx = get_eth_client_index(mac_addr); - if (clt_indx == IPACM_INVALID_INDEX) - { - IPACMDBG_H("eth client not attached\n"); - return IPACM_SUCCESS; - } - - /* First reset nat rules and then route rules */ - if(get_client_memptr(eth_client, clt_indx)->ipv4_set == true) - { - IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(eth_client, clt_indx)->v4_addr); - CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, clt_indx)->v4_addr); - } - - if (delete_eth_rtrules(clt_indx, IPA_IP_v4)) - { - IPACMERR("unbale to delete ecm-client v4 route rules for index: %d\n", clt_indx); - return IPACM_FAILURE; - } - - if (delete_eth_rtrules(clt_indx, IPA_IP_v6)) - { - IPACMERR("unbale to delete ecm-client v6 route rules for index: %d\n", clt_indx); - return IPACM_FAILURE; - } - - /* Delete eth client header */ - if(get_client_memptr(eth_client, clt_indx)->ipv4_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, clt_indx)->hdr_hdl_v4) - == false) - { - return IPACM_FAILURE; - } - get_client_memptr(eth_client, clt_indx)->ipv4_header_set = false; - } - - if(get_client_memptr(eth_client, clt_indx)->ipv6_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, clt_indx)->hdr_hdl_v6) - == false) - { - return IPACM_FAILURE; - } - get_client_memptr(eth_client, clt_indx)->ipv6_header_set = false; - } - - /* Reset ip_set to 0*/ - get_client_memptr(eth_client, clt_indx)->ipv4_set = false; - get_client_memptr(eth_client, clt_indx)->ipv6_set = 0; - get_client_memptr(eth_client, clt_indx)->ipv4_header_set = false; - get_client_memptr(eth_client, clt_indx)->ipv6_header_set = false; - get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = false; - get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = 0; - - ipv4_addr = get_client_memptr(eth_client, clt_indx)->v4_addr; - snprintf(cmd, sizeof(cmd), "ip neighbor del %d.%d.%d.%d dev %s", - (unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16), - (unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, dev_name); - system(cmd); - IPACMDBG_H("%s\n", cmd); - - for (; clt_indx < num_eth_client_tmp - 1; clt_indx++) - { - memcpy(get_client_memptr(eth_client, clt_indx)->mac, - get_client_memptr(eth_client, (clt_indx + 1))->mac, - sizeof(get_client_memptr(eth_client, clt_indx)->mac)); - - get_client_memptr(eth_client, clt_indx)->hdr_hdl_v4 = get_client_memptr(eth_client, (clt_indx + 1))->hdr_hdl_v4; - get_client_memptr(eth_client, clt_indx)->hdr_hdl_v6 = get_client_memptr(eth_client, (clt_indx + 1))->hdr_hdl_v6; - get_client_memptr(eth_client, clt_indx)->v4_addr = get_client_memptr(eth_client, (clt_indx + 1))->v4_addr; - - get_client_memptr(eth_client, clt_indx)->ipv4_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv4_set; - get_client_memptr(eth_client, clt_indx)->ipv6_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv6_set; - get_client_memptr(eth_client, clt_indx)->ipv4_header_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv4_header_set; - get_client_memptr(eth_client, clt_indx)->ipv6_header_set = get_client_memptr(eth_client, (clt_indx + 1))->ipv6_header_set; - - get_client_memptr(eth_client, clt_indx)->route_rule_set_v4 = get_client_memptr(eth_client, (clt_indx + 1))->route_rule_set_v4; - get_client_memptr(eth_client, clt_indx)->route_rule_set_v6 = get_client_memptr(eth_client, (clt_indx + 1))->route_rule_set_v6; - - for (num_v6=0;num_v6< get_client_memptr(eth_client, clt_indx)->ipv6_set;num_v6++) - { - get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][0] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][0]; - get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][1] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][1]; - get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][2] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][2]; - get_client_memptr(eth_client, clt_indx)->v6_addr[num_v6][3] = get_client_memptr(eth_client, (clt_indx + 1))->v6_addr[num_v6][3]; - } - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4 = - get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v4; - - for(num_v6=0;num_v6< get_client_memptr(eth_client, clt_indx)->route_rule_set_v6;num_v6++) - { - get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6] = - get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6[num_v6]; - get_client_memptr(eth_client, clt_indx)->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6] = - get_client_memptr(eth_client, (clt_indx + 1))->eth_rt_hdl[tx_index].eth_rt_rule_hdl_v6_wan[num_v6]; - } - } - } - - IPACMDBG_H(" %d eth client deleted successfully \n", num_eth_client); - num_eth_client = num_eth_client - 1; - IPACMDBG_H(" Number of eth client: %d\n", num_eth_client); - - /* Del RM dependency */ - if(num_eth_client == 0) - { - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule*/ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) - { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - } - } - - return IPACM_SUCCESS; -} - -/*handle LAN iface down event*/ -int IPACM_Lan::handle_down_evt() -{ - int i; - int res = IPACM_SUCCESS; - char cmd[200] = {0}; - uint32_t ipv4_addr; - - IPACMDBG_H("lan handle_down_evt\n "); - if (ipa_if_cate == ODU_IF) - { - /* delete ODU default RT rules */ - if (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true) - { - IPACMDBG_H("eMBMS enable, delete eMBMS DL RT rule\n"); - handle_odu_route_del(); - } - - /* delete full header */ - if (ipv4_header_set) - { - if (m_header.DeleteHeaderHdl(ODU_hdr_hdl_v4) - == false) - { - IPACMERR("ODU ipv4 header delete fail\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("ODU ipv4 header delete success\n"); - } - - if (ipv6_header_set) - { - if (m_header.DeleteHeaderHdl(ODU_hdr_hdl_v6) - == false) - { - IPACMERR("ODU ipv6 header delete fail\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMERR("ODU ipv6 header delete success\n"); - } - } - - /* no iface address up, directly close iface*/ - if (ip_type == IPACM_IP_NULL) - { - goto fail; - } - - /* delete wan filter rule */ - if (IPACM_Wan::isWanUP(ipa_if_num) && rx_prop != NULL) - { - IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode); - handle_wan_down(IPACM_Wan::backhaul_is_sta_mode); - } - - if (IPACM_Wan::isWanUP_V6(ipa_if_num) && rx_prop != NULL) - { - IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode); - handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode); - } - - /* delete default filter rules */ - if (ip_type != IPA_IP_v6 && rx_prop != NULL) - { - if(m_filtering.DeleteFilteringHdls(ipv4_icmp_flt_rule_hdl, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE) == false) - { - IPACMERR("Error Deleting ICMPv4 Filtering Rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE); - - if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES) == false) - { - IPACMERR("Error Deleting Filtering Rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES); - - /* free private-subnet ipv4 filter rules */ - if (IPACM_Iface::ipacmcfg->ipa_num_private_subnet > IPA_PRIV_SUBNET_FILTER_RULE_HANDLES) - { - IPACMERR(" the number of rules are bigger than array, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - -#ifdef FEATURE_IPA_ANDROID - if(m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES) == false) - { - IPACMERR("Error deleting private subnet IPv4 flt rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES); -#else - if (m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, IPACM_Iface::ipacmcfg->ipa_num_private_subnet) == false) - { - IPACMERR("Error deleting private subnet IPv4 flt rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPACM_Iface::ipacmcfg->ipa_num_private_subnet); -#endif - IPACMDBG_H("Deleted private subnet v4 filter rules successfully.\n"); - } - IPACMDBG_H("Finished delete default iface ipv4 filtering rules \n "); - - if (ip_type != IPA_IP_v4 && rx_prop != NULL) - { - if(m_filtering.DeleteFilteringHdls(ipv6_icmp_flt_rule_hdl, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE) == false) - { - IPACMERR("Error Deleting ICMPv6 Filtering Rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE); - - if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES) == false) - { - IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES); - } - IPACMDBG_H("Finished delete default iface ipv6 filtering rules \n "); - - if (ip_type != IPA_IP_v6) - { - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) - == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - IPACMDBG_H("Finished delete default iface ipv4 rules \n "); - - /* delete default v6 routing rule */ - if (ip_type != IPA_IP_v4) - { - /* may have multiple ipv6 iface-RT rules*/ - for (i = 0; i < 2*num_dft_rt_v6; i++) - { - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + i], IPA_IP_v6) - == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - } - - IPACMDBG_H("Finished delete default iface ipv6 rules \n "); - - /* free the edm clients cache */ - IPACMDBG_H("Free ecm clients cache\n"); - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete all IPV4V6 RT-rule */ - IPACMDBG_H("dev %s delete producer dependency\n", dev_name); - if (tx_prop != NULL) - { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - } - - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL); - -/* Delete private subnet*/ -#ifdef FEATURE_IPA_ANDROID - if (ip_type != IPA_IP_v6) - { - IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet); - IPACMDBG_H(" Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet); - if(IPACM_Iface::ipacmcfg->DelPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false) - { - IPACMERR(" can't Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet); - } - } - - /* reset the IPA-client pipe enum */ - if(ipa_if_cate != WAN_IF) - { - handle_tethering_client(true, IPACM_CLIENT_USB); - } -#endif /* defined(FEATURE_IPA_ANDROID)*/ -fail: - /* clean eth-client header, routing rules */ - IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client); - for (i = 0; i < num_eth_client; i++) - { - ipv4_addr = get_client_memptr(eth_client, i)->v4_addr; - snprintf(cmd, sizeof(cmd), "ip neighbor del %d.%d.%d.%d dev %s", - (unsigned char)(ipv4_addr >> 24), (unsigned char)(ipv4_addr >> 16), - (unsigned char)(ipv4_addr >> 8), (unsigned char)ipv4_addr, dev_name); - system(cmd); - IPACMDBG_H("%s\n", cmd); - - /* First reset nat rules and then route rules */ - if(get_client_memptr(eth_client, i)->ipv4_set == true) - { - IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(eth_client, i)->v4_addr); - CtList->HandleNeighIpAddrDelEvt(get_client_memptr(eth_client, i)->v4_addr); - } - - if (delete_eth_rtrules(i, IPA_IP_v4)) - { - IPACMERR("unbale to delete ecm-client v4 route rules for index %d\n", i); - res = IPACM_FAILURE; - } - - if (delete_eth_rtrules(i, IPA_IP_v6)) - { - IPACMERR("unbale to delete ecm-client v6 route rules for index %d\n", i); - res = IPACM_FAILURE; - } - - IPACMDBG_H("Delete %d client header\n", num_eth_client); - - if(get_client_memptr(eth_client, i)->ipv4_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v4) - == false) - { - res = IPACM_FAILURE; - } - } - - if(get_client_memptr(eth_client, i)->ipv6_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(eth_client, i)->hdr_hdl_v6) - == false) - { - res = IPACM_FAILURE; - } - } - } /* end of for loop */ - - /* check software routing fl rule hdl */ - if (softwarerouting_act == true && rx_prop != NULL) - { - handle_software_routing_disable(); - } - - if (odu_route_rule_v4_hdl != NULL) - { - free(odu_route_rule_v4_hdl); - } - if (odu_route_rule_v6_hdl != NULL) - { - free(odu_route_rule_v6_hdl); - } - /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */ - if (rx_prop != NULL) - { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACMDBG_H("Finished delete dependency \n "); - free(rx_prop); - } - - if (eth_client != NULL) - { - free(eth_client); - } - - if (tx_prop != NULL) - { - free(tx_prop); - } - if (iface_query != NULL) - { - free(iface_query); - } - - is_active = false; - post_del_self_evt(); - - return res; -} - -/* install UL filter rule from Q6 */ -int IPACM_Lan::handle_uplink_filter_rule(ipacm_ext_prop *prop, ipa_ip_type iptype, uint8_t xlat_mux_id) -{ - ipa_flt_rule_add flt_rule_entry; - int len = 0, cnt, ret = IPACM_SUCCESS; - ipa_ioc_add_flt_rule *pFilteringTable; - ipa_fltr_installed_notif_req_msg_v01 flt_index; - int fd; - int i, index; - uint32_t value = 0; - - IPACMDBG_H("Set modem UL flt rules\n"); - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if(prop == NULL || prop->num_ext_props <= 0) - { - IPACMDBG_H("No extended property.\n"); - return IPACM_SUCCESS; - } - - fd = open(IPA_DEVICE_NAME, O_RDWR); - if (0 == fd) - { - IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); - return IPACM_FAILURE; - } - if (prop->num_ext_props > MAX_WAN_UL_FILTER_RULES) - { - IPACMERR("number of modem UL rules > MAX_WAN_UL_FILTER_RULES, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - - memset(&flt_index, 0, sizeof(flt_index)); - flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe); - flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01; -#ifndef FEATURE_IPA_V3 - flt_index.filter_index_list_len = prop->num_ext_props; -#else /* defined (FEATURE_IPA_V3) */ - flt_index.rule_id_valid = 1; - flt_index.rule_id_len = prop->num_ext_props; -#endif - flt_index.embedded_pipe_index_valid = 1; - flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD); - flt_index.retain_header_valid = 1; - flt_index.retain_header = 0; - flt_index.embedded_call_mux_id_valid = 1; - flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); -#ifndef FEATURE_IPA_V3 - IPACMDBG_H("flt_index: src pipe: %d, num of rules: %d, ebd pipe: %d, mux id: %d\n", - flt_index.source_pipe_index, flt_index.filter_index_list_len, flt_index.embedded_pipe_index, flt_index.embedded_call_mux_id); -#else /* defined (FEATURE_IPA_V3) */ - IPACMDBG_H("flt_index: src pipe: %d, num of rules: %d, ebd pipe: %d, mux id: %d\n", - flt_index.source_pipe_index, flt_index.rule_id_len, flt_index.embedded_pipe_index, flt_index.embedded_call_mux_id); -#endif - len = sizeof(struct ipa_ioc_add_flt_rule) + prop->num_ext_props * sizeof(struct ipa_flt_rule_add); - pFilteringTable = (struct ipa_ioc_add_flt_rule*)malloc(len); - if (pFilteringTable == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - close(fd); - return IPACM_FAILURE; - } - memset(pFilteringTable, 0, len); - - pFilteringTable->commit = 1; - pFilteringTable->ep = rx_prop->rx[0].src_pipe; - pFilteringTable->global = false; - pFilteringTable->ip = iptype; - pFilteringTable->num_rules = prop->num_ext_props; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); // Zero All Fields - flt_rule_entry.at_rear = 1; -#ifdef FEATURE_IPA_V3 - if (flt_rule_entry.rule.eq_attrib.ipv4_frag_eq_present) - flt_rule_entry.at_rear = 0; -#endif - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - if(iptype == IPA_IP_v4) - { - if (ipa_if_cate == ODU_IF && IPACM_Wan::isWan_Bridge_Mode()) - { - IPACMDBG_H("WAN, ODU are in bridge mode \n"); - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT; - } - } - else if(iptype == IPA_IP_v6) - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - else - { - IPACMERR("IP type is not expected.\n"); - ret = IPACM_FAILURE; - goto fail; - } - - index = IPACM_Iface::ipacmcfg->getFltRuleCount(rx_prop->rx[0].src_pipe, iptype); - - for(cnt=0; cnt<prop->num_ext_props; cnt++) - { - memcpy(&flt_rule_entry.rule.eq_attrib, - &prop->prop[cnt].eq_attrib, - sizeof(prop->prop[cnt].eq_attrib)); - flt_rule_entry.rule.rt_tbl_idx = prop->prop[cnt].rt_tbl_idx; - - /* Handle XLAT configuration */ - if ((iptype == IPA_IP_v4) && prop->prop[cnt].is_xlat_rule && (xlat_mux_id != 0)) - { - /* fill the value of meta-data */ - value = xlat_mux_id; - flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1; - flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0; - flt_rule_entry.rule.eq_attrib.metadata_meq32.value = (value & 0xFF) << 16; - flt_rule_entry.rule.eq_attrib.metadata_meq32.mask = 0x00FF0000; - IPACMDBG_H("xlat meta-data is modified for rule: %d has index %d with xlat_mux_id: %d\n", - cnt, index, xlat_mux_id); - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = prop->prop[cnt].is_rule_hashable; - flt_rule_entry.rule.rule_id = prop->prop[cnt].rule_id; - if(rx_prop->rx[0].attrib.attrib_mask & IPA_FLT_META_DATA) //turn on meta-data equation - { - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<9); - flt_rule_entry.rule.eq_attrib.metadata_meq32_present = 1; - flt_rule_entry.rule.eq_attrib.metadata_meq32.offset = 0; - flt_rule_entry.rule.eq_attrib.metadata_meq32.value |= rx_prop->rx[0].attrib.meta_data; - flt_rule_entry.rule.eq_attrib.metadata_meq32.mask |= rx_prop->rx[0].attrib.meta_data_mask; - } -#endif - memcpy(&pFilteringTable->rules[cnt], &flt_rule_entry, sizeof(flt_rule_entry)); - - IPACMDBG_H("Modem UL filtering rule %d has index %d\n", cnt, index); -#ifndef FEATURE_IPA_V3 - flt_index.filter_index_list[cnt].filter_index = index; - flt_index.filter_index_list[cnt].filter_handle = prop->prop[cnt].filter_hdl; -#else /* defined (FEATURE_IPA_V3) */ - flt_index.rule_id[cnt] = prop->prop[cnt].rule_id; -#endif - index++; - } - - if(false == m_filtering.SendFilteringRuleIndex(&flt_index)) - { - IPACMERR("Error sending filtering rule index, aborting...\n"); - ret = IPACM_FAILURE; - goto fail; - } - - if(false == m_filtering.AddFilteringRule(pFilteringTable)) - { - IPACMERR("Error Adding RuleTable to Filtering, aborting...\n"); - ret = IPACM_FAILURE; - goto fail; - } - else - { - if(iptype == IPA_IP_v4) - { - for(i=0; i<pFilteringTable->num_rules; i++) - { - wan_ul_fl_rule_hdl_v4[num_wan_ul_fl_rule_v4] = pFilteringTable->rules[i].flt_rule_hdl; - num_wan_ul_fl_rule_v4++; - } - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, iptype, pFilteringTable->num_rules); - } - else if(iptype == IPA_IP_v6) - { - for(i=0; i<pFilteringTable->num_rules; i++) - { - wan_ul_fl_rule_hdl_v6[num_wan_ul_fl_rule_v6] = pFilteringTable->rules[i].flt_rule_hdl; - num_wan_ul_fl_rule_v6++; - } - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, iptype, pFilteringTable->num_rules); - } - else - { - IPACMERR("IP type is not expected.\n"); - goto fail; - } - } - -fail: - free(pFilteringTable); - close(fd); - return ret; -} - -int IPACM_Lan::handle_wan_down_v6(bool is_sta_mode) -{ - ipa_fltr_installed_notif_req_msg_v01 flt_index; - int fd; - - fd = open(IPA_DEVICE_NAME, O_RDWR); - if (0 == fd) - { - IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); - return IPACM_FAILURE; - } - - delete_ipv6_prefix_flt_rule(); - - memset(ipv6_prefix, 0, sizeof(ipv6_prefix)); - - if(is_sta_mode == false) - { - if (num_wan_ul_fl_rule_v6 > MAX_WAN_UL_FILTER_RULES) - { - IPACMERR(" the number of rules (%d) are bigger than array (%d), aborting...\n", num_wan_ul_fl_rule_v6, MAX_WAN_UL_FILTER_RULES); - close(fd); - return IPACM_FAILURE; - } - if (num_wan_ul_fl_rule_v6 == 0) - { - IPACMERR("No modem UL rules were installed, return...\n"); - close(fd); - return IPACM_FAILURE; - } - - if (m_filtering.DeleteFilteringHdls(wan_ul_fl_rule_hdl_v6, - IPA_IP_v6, num_wan_ul_fl_rule_v6) == false) - { - IPACMERR("Error Deleting RuleTable(1) to Filtering, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_wan_ul_fl_rule_v6); - memset(wan_ul_fl_rule_hdl_v6, 0, MAX_WAN_UL_FILTER_RULES * sizeof(uint32_t)); - num_wan_ul_fl_rule_v6 = 0; - modem_ul_v6_set = false; - - memset(&flt_index, 0, sizeof(flt_index)); - flt_index.source_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[0].src_pipe); - flt_index.install_status = IPA_QMI_RESULT_SUCCESS_V01; -#ifndef FEATURE_IPA_V3 - flt_index.filter_index_list_len = 0; -#else /* defined (FEATURE_IPA_V3) */ - flt_index.rule_id_valid = 1; - flt_index.rule_id_len = 0; -#endif - flt_index.embedded_pipe_index_valid = 1; - flt_index.embedded_pipe_index = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, IPA_CLIENT_APPS_LAN_WAN_PROD); - flt_index.retain_header_valid = 1; - flt_index.retain_header = 0; - flt_index.embedded_call_mux_id_valid = 1; - flt_index.embedded_call_mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); - if(false == m_filtering.SendFilteringRuleIndex(&flt_index)) - { - IPACMERR("Error sending filtering rule index, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - } - else - { - if (m_filtering.DeleteFilteringHdls(&dft_v6fl_rule_hdl[IPV6_DEFAULT_FILTERTING_RULES], - IPA_IP_v6, 1) == false) - { - IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n"); - close(fd); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - } - close(fd); - return IPACM_SUCCESS; -} - -int IPACM_Lan::reset_to_dummy_flt_rule(ipa_ip_type iptype, uint32_t rule_hdl) -{ - int len, res = IPACM_SUCCESS; - struct ipa_flt_rule_mdfy flt_rule; - struct ipa_ioc_mdfy_flt_rule* pFilteringTable; - - IPACMDBG_H("Reset flt rule to dummy, IP type: %d, hdl: %d\n", iptype, rule_hdl); - len = sizeof(struct ipa_ioc_mdfy_flt_rule) + sizeof(struct ipa_flt_rule_mdfy); - pFilteringTable = (struct ipa_ioc_mdfy_flt_rule*)malloc(len); - - if (pFilteringTable == NULL) - { - IPACMERR("Error allocate flt rule memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable, 0, len); - - pFilteringTable->commit = 1; - pFilteringTable->ip = iptype; - pFilteringTable->num_rules = 1; - - memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy)); - flt_rule.status = -1; - flt_rule.rule_hdl = rule_hdl; - - flt_rule.rule.retain_hdr = 0; - flt_rule.rule.action = IPA_PASS_TO_EXCEPTION; - - if(iptype == IPA_IP_v4) - { - IPACMDBG_H("Reset IPv4 flt rule to dummy\n"); - - flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR; - flt_rule.rule.attrib.u.v4.dst_addr = ~0; - flt_rule.rule.attrib.u.v4.dst_addr_mask = ~0; - flt_rule.rule.attrib.u.v4.src_addr = ~0; - flt_rule.rule.attrib.u.v4.src_addr_mask = ~0; - - memcpy(&(pFilteringTable->rules[0]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy)); - if (false == m_filtering.ModifyFilteringRule(pFilteringTable)) - { - IPACMERR("Error modifying filtering rule.\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - IPACMDBG_H("Flt rule reset to dummy, hdl: 0x%x, status: %d\n", pFilteringTable->rules[0].rule_hdl, - pFilteringTable->rules[0].status); - } - } - else if(iptype == IPA_IP_v6) - { - IPACMDBG_H("Reset IPv6 flt rule to dummy\n"); - - flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR; - flt_rule.rule.attrib.u.v6.src_addr[0] = ~0; - flt_rule.rule.attrib.u.v6.src_addr[1] = ~0; - flt_rule.rule.attrib.u.v6.src_addr[2] = ~0; - flt_rule.rule.attrib.u.v6.src_addr[3] = ~0; - flt_rule.rule.attrib.u.v6.src_addr_mask[0] = ~0; - flt_rule.rule.attrib.u.v6.src_addr_mask[1] = ~0; - flt_rule.rule.attrib.u.v6.src_addr_mask[2] = ~0; - flt_rule.rule.attrib.u.v6.src_addr_mask[3] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr[0] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr[1] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr[2] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr[3] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr_mask[0] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr_mask[1] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr_mask[2] = ~0; - flt_rule.rule.attrib.u.v6.dst_addr_mask[3] = ~0; - - - memcpy(&(pFilteringTable->rules[0]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy)); - if (false == m_filtering.ModifyFilteringRule(pFilteringTable)) - { - IPACMERR("Error modifying filtering rule.\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - IPACMDBG_H("Flt rule reset to dummy, hdl: 0x%x, status: %d\n", pFilteringTable->rules[0].rule_hdl, - pFilteringTable->rules[0].status); - } - } - else - { - IPACMERR("IP type is not expected.\n"); - res = IPACM_FAILURE; - goto fail; - } - -fail: - free(pFilteringTable); - return res; -} - -void IPACM_Lan::post_del_self_evt() -{ - ipacm_cmd_q_data evt; - ipacm_event_data_fid* fid; - fid = (ipacm_event_data_fid*)malloc(sizeof(ipacm_event_data_fid)); - if(fid == NULL) - { - IPACMERR("Failed to allocate fid memory.\n"); - return; - } - memset(fid, 0, sizeof(ipacm_event_data_fid)); - memset(&evt, 0, sizeof(ipacm_cmd_q_data)); - - fid->if_index = ipa_if_num; - - evt.evt_data = (void*)fid; - evt.event = IPA_LAN_DELETE_SELF; - - IPACMDBG_H("Posting event IPA_LAN_DELETE_SELF\n"); - IPACM_EvtDispatcher::PostEvt(&evt); -} - -/*handle reset usb-client rt-rules */ -int IPACM_Lan::handle_lan_client_reset_rt(ipa_ip_type iptype) -{ - int i, res = IPACM_SUCCESS; - - /* clean eth-client routing rules */ - IPACMDBG_H("left %d eth clients need to be deleted \n ", num_eth_client); - for (i = 0; i < num_eth_client; i++) - { - res = delete_eth_rtrules(i, iptype); - if (res != IPACM_SUCCESS) - { - IPACMERR("Failed to delete old iptype(%d) rules.\n", iptype); - return res; - } - } /* end of for loop */ - - /* Reset ip-address */ - for (i = 0; i < num_eth_client; i++) - { - if(iptype == IPA_IP_v4) - { - get_client_memptr(eth_client, i)->ipv4_set = false; - } - else - { - get_client_memptr(eth_client, i)->ipv6_set = 0; - } - } /* end of for loop */ - return res; -} - -int IPACM_Lan::install_ipv4_icmp_flt_rule() -{ - int len; - struct ipa_ioc_add_flt_rule* flt_rule; - struct ipa_flt_rule_add flt_rule_entry; - - if(rx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); - - flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!flt_rule) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - flt_rule->commit = 1; - flt_rule->ep = rx_prop->rx[0].src_pipe; - flt_rule->global = false; - flt_rule->ip = IPA_IP_v4; - flt_rule->num_rules = 1; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; - flt_rule_entry.rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP; - memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (m_filtering.AddFilteringRule(flt_rule) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - free(flt_rule); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - ipv4_icmp_flt_rule_hdl[0] = flt_rule->rules[0].flt_rule_hdl; - IPACMDBG_H("IPv4 icmp filter rule HDL:0x%x\n", ipv4_icmp_flt_rule_hdl[0]); - free(flt_rule); - } - } - return IPACM_SUCCESS; -} - -int IPACM_Lan::install_ipv6_icmp_flt_rule() -{ - - int len; - struct ipa_ioc_add_flt_rule* flt_rule; - struct ipa_flt_rule_add flt_rule_entry; - - if(rx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); - - flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!flt_rule) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - flt_rule->commit = 1; - flt_rule->ep = rx_prop->rx[0].src_pipe; - flt_rule->global = false; - flt_rule->ip = IPA_IP_v6; - flt_rule->num_rules = 1; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = false; -#endif - memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; - flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6; - memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (m_filtering.AddFilteringRule(flt_rule) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - free(flt_rule); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - ipv6_icmp_flt_rule_hdl[0] = flt_rule->rules[0].flt_rule_hdl; - IPACMDBG_H("IPv6 icmp filter rule HDL:0x%x\n", ipv6_icmp_flt_rule_hdl[0]); - free(flt_rule); - } - } - return IPACM_SUCCESS; -} - -int IPACM_Lan::add_dummy_private_subnet_flt_rule(ipa_ip_type iptype) -{ - if(rx_prop == NULL) - { - IPACMDBG_H("There is no rx_prop for iface %s, not able to add dummy private subnet filtering rule.\n", dev_name); - return 0; - } - - if(iptype == IPA_IP_v6) - { - IPACMDBG_H("There is no ipv6 dummy filter rules needed for iface %s\n", dev_name); - return 0; - } - int i, len, res = IPACM_SUCCESS; - struct ipa_flt_rule_add flt_rule; - ipa_ioc_add_flt_rule* pFilteringTable; - - len = sizeof(struct ipa_ioc_add_flt_rule) + IPA_MAX_PRIVATE_SUBNET_ENTRIES * sizeof(struct ipa_flt_rule_add); - - pFilteringTable = (struct ipa_ioc_add_flt_rule *)malloc(len); - if (pFilteringTable == NULL) - { - IPACMERR("Error allocate flt table memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable, 0, len); - - pFilteringTable->commit = 1; - pFilteringTable->ep = rx_prop->rx[0].src_pipe; - pFilteringTable->global = false; - pFilteringTable->ip = iptype; - pFilteringTable->num_rules = IPA_MAX_PRIVATE_SUBNET_ENTRIES; - - memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule.rule.retain_hdr = 0; - flt_rule.at_rear = true; - flt_rule.flt_rule_hdl = -1; - flt_rule.status = -1; - flt_rule.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule.rule.hashable = true; -#endif - memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, - sizeof(flt_rule.rule.attrib)); - - if(iptype == IPA_IP_v4) - { - flt_rule.rule.attrib.attrib_mask = IPA_FLT_SRC_ADDR | IPA_FLT_DST_ADDR; - flt_rule.rule.attrib.u.v4.src_addr_mask = ~0; - flt_rule.rule.attrib.u.v4.src_addr = ~0; - flt_rule.rule.attrib.u.v4.dst_addr_mask = ~0; - flt_rule.rule.attrib.u.v4.dst_addr = ~0; - - for(i=0; i<IPA_MAX_PRIVATE_SUBNET_ENTRIES; i++) - { - memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_add)); - } - - if (false == m_filtering.AddFilteringRule(pFilteringTable)) - { - IPACMERR("Error adding dummy private subnet v4 flt rule\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES); - /* copy filter rule hdls */ - for (int i = 0; i < IPA_MAX_PRIVATE_SUBNET_ENTRIES; i++) - { - if (pFilteringTable->rules[i].status == 0) - { - private_fl_rule_hdl[i] = pFilteringTable->rules[i].flt_rule_hdl; - IPACMDBG_H("Private subnet v4 flt rule %d hdl:0x%x\n", i, private_fl_rule_hdl[i]); - } - else - { - IPACMERR("Failed adding lan2lan v4 flt rule %d\n", i); - res = IPACM_FAILURE; - goto fail; - } - } - } - } -fail: - free(pFilteringTable); - return res; -} - -int IPACM_Lan::handle_private_subnet_android(ipa_ip_type iptype) -{ - int i, len, res = IPACM_SUCCESS; - struct ipa_flt_rule_mdfy flt_rule; - struct ipa_ioc_mdfy_flt_rule* pFilteringTable; - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if(iptype == IPA_IP_v6) - { - IPACMDBG_H("There is no ipv6 dummy filter rules needed for iface %s\n", dev_name); - return 0; - } - else - { - for(i=0; i<IPA_MAX_PRIVATE_SUBNET_ENTRIES; i++) - { - reset_to_dummy_flt_rule(IPA_IP_v4, private_fl_rule_hdl[i]); - } - - len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (IPACM_Iface::ipacmcfg->ipa_num_private_subnet) * sizeof(struct ipa_flt_rule_mdfy); - pFilteringTable = (struct ipa_ioc_mdfy_flt_rule*)malloc(len); - if (!pFilteringTable) - { - IPACMERR("Failed to allocate ipa_ioc_mdfy_flt_rule memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable, 0, len); - - pFilteringTable->commit = 1; - pFilteringTable->ip = iptype; - pFilteringTable->num_rules = (uint8_t)IPACM_Iface::ipacmcfg->ipa_num_private_subnet; - - /* Make LAN-traffic always go A5, use default IPA-RT table */ - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_default_v4)) - { - IPACMERR("Failed to get routing table handle.\n"); - res = IPACM_FAILURE; - goto fail; - } - - memset(&flt_rule, 0, sizeof(struct ipa_flt_rule_mdfy)); - flt_rule.status = -1; - - flt_rule.rule.retain_hdr = 1; - flt_rule.rule.to_uc = 0; - flt_rule.rule.action = IPA_PASS_TO_ROUTING; - flt_rule.rule.eq_attrib_type = 0; - flt_rule.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_default_v4.hdl; - IPACMDBG_H("Private filter rule use table: %s\n",IPACM_Iface::ipacmcfg->rt_tbl_default_v4.name); - - memcpy(&flt_rule.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule.rule.attrib)); - flt_rule.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - - for (i = 0; i < (IPACM_Iface::ipacmcfg->ipa_num_private_subnet); i++) - { - flt_rule.rule_hdl = private_fl_rule_hdl[i]; - flt_rule.rule.attrib.u.v4.dst_addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_mask; - flt_rule.rule.attrib.u.v4.dst_addr = IPACM_Iface::ipacmcfg->private_subnet_table[i].subnet_addr; - memcpy(&(pFilteringTable->rules[i]), &flt_rule, sizeof(struct ipa_flt_rule_mdfy)); - IPACMDBG_H(" IPACM private subnet_addr as: 0x%x entry(%d)\n", flt_rule.rule.attrib.u.v4.dst_addr, i); - } - - if (false == m_filtering.ModifyFilteringRule(pFilteringTable)) - { - IPACMERR("Failed to modify private subnet filtering rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - } -fail: - if(pFilteringTable != NULL) - { - free(pFilteringTable); - } - return res; -} - -int IPACM_Lan::install_ipv6_prefix_flt_rule(uint32_t* prefix) -{ - if(prefix == NULL) - { - IPACMERR("IPv6 prefix is empty.\n"); - return IPACM_FAILURE; - } - IPACMDBG_H("Receive IPv6 prefix: 0x%08x%08x.\n", prefix[0], prefix[1]); - - int len; - struct ipa_ioc_add_flt_rule* flt_rule; - struct ipa_flt_rule_add flt_rule_entry; - - if(rx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); - - flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!flt_rule) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - flt_rule->commit = 1; - flt_rule->ep = rx_prop->rx[0].src_pipe; - flt_rule->global = false; - flt_rule->ip = IPA_IP_v6; - flt_rule->num_rules = 1; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = prefix[0]; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = prefix[1]; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x0; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x0; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x0; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x0; - memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (m_filtering.AddFilteringRule(flt_rule) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - free(flt_rule); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - ipv6_prefix_flt_rule_hdl[0] = flt_rule->rules[0].flt_rule_hdl; - IPACMDBG_H("IPv6 prefix filter rule HDL:0x%x\n", ipv6_prefix_flt_rule_hdl[0]); - free(flt_rule); - } - } - return IPACM_SUCCESS; -} - -void IPACM_Lan::delete_ipv6_prefix_flt_rule() -{ - if(m_filtering.DeleteFilteringHdls(ipv6_prefix_flt_rule_hdl, IPA_IP_v6, NUM_IPV6_PREFIX_FLT_RULE) == false) - { - IPACMERR("Failed to delete ipv6 prefix flt rule.\n"); - return; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, NUM_IPV6_PREFIX_FLT_RULE); - return; -} - -int IPACM_Lan::handle_addr_evt_odu_bridge(ipacm_event_data_addr* data) -{ - int fd, res = IPACM_SUCCESS; - struct in6_addr ipv6_addr; - if(data == NULL) - { - IPACMERR("Failed to get interface IP address.\n"); - return IPACM_FAILURE; - } - - if(data->iptype == IPA_IP_v6) - { - fd = open(IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU, O_RDWR); - if(fd == 0) - { - IPACMERR("Failed to open %s.\n", IPACM_Iface::ipacmcfg->DEVICE_NAME_ODU); - return IPACM_FAILURE; - } - - memcpy(&ipv6_addr, data->ipv6_addr, sizeof(struct in6_addr)); - - if( ioctl(fd, ODU_BRIDGE_IOC_SET_LLV6_ADDR, &ipv6_addr) ) - { - IPACMERR("Failed to write IPv6 address to odu driver.\n"); - res = IPACM_FAILURE; - } - num_dft_rt_v6++; - close(fd); - } - - return res; -} - -ipa_hdr_proc_type IPACM_Lan::eth_bridge_get_hdr_proc_type(ipa_hdr_l2_type t1, ipa_hdr_l2_type t2) -{ - if(t1 == IPA_HDR_L2_ETHERNET_II) - { - if(t2 == IPA_HDR_L2_ETHERNET_II) - { - return IPA_HDR_PROC_ETHII_TO_ETHII; - } - if(t2 == IPA_HDR_L2_802_3) - { - return IPA_HDR_PROC_ETHII_TO_802_3; - } - } - - if(t1 == IPA_HDR_L2_802_3) - { - if(t2 == IPA_HDR_L2_ETHERNET_II) - { - return IPA_HDR_PROC_802_3_TO_ETHII; - } - if(t2 == IPA_HDR_L2_802_3) - { - return IPA_HDR_PROC_802_3_TO_802_3; - } - } - - return IPA_HDR_PROC_NONE; -} - -int IPACM_Lan::eth_bridge_get_hdr_template_hdl(uint32_t* hdr_hdl) -{ - if(hdr_hdl == NULL) - { - IPACMDBG_H("Hdr handle pointer is empty.\n"); - return IPACM_FAILURE; - } - - struct ipa_ioc_get_hdr hdr; - memset(&hdr, 0, sizeof(hdr)); - - memcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); - if(m_header.GetHeaderHandle(&hdr) == false) - { - IPACMERR("Failed to get template hdr hdl.\n"); - return IPACM_FAILURE; - } - - *hdr_hdl = hdr.hdl; - return IPACM_SUCCESS; -} - -int IPACM_Lan::handle_cradle_wan_mode_switch(bool is_wan_bridge_mode) -{ - struct ipa_flt_rule_mdfy flt_rule_entry; - int len = 0; - ipa_ioc_mdfy_flt_rule *m_pFilteringTable; - - IPACMDBG_H("Handle wan mode swtich: is wan bridge mode?%d\n", is_wan_bridge_mode); - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - len = sizeof(struct ipa_ioc_mdfy_flt_rule) + (1 * sizeof(struct ipa_flt_rule_mdfy)); - m_pFilteringTable = (struct ipa_ioc_mdfy_flt_rule *)calloc(1, len); - if (m_pFilteringTable == NULL) - { - PERROR("Error Locate ipa_ioc_mdfy_flt_rule memory...\n"); - return IPACM_FAILURE; - } - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ip = IPA_IP_v4; - m_pFilteringTable->num_rules = (uint8_t)1; - - IPACMDBG_H("Retrieving routing hanle for table: %s\n", - IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name); - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4)) - { - IPACMERR("m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v4=0x%p) Failed.\n", - &IPACM_Iface::ipacmcfg->rt_tbl_wan_v4); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - IPACMDBG_H("Routing handle for table: %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl); - - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_mdfy)); // Zero All Fields - flt_rule_entry.status = -1; - flt_rule_entry.rule_hdl = lan_wan_fl_rule_hdl[0]; - - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 0; - if(is_wan_bridge_mode) - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_SRC_NAT; - } - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.hdl; - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x0; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x0; - - memcpy(&m_pFilteringTable->rules[0], &flt_rule_entry, sizeof(flt_rule_entry)); - if (false == m_filtering.ModifyFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Modifying RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACMDBG_H("flt rule hdl = %d, status = %d\n", - m_pFilteringTable->rules[0].rule_hdl, - m_pFilteringTable->rules[0].status); - } - free(m_pFilteringTable); - return IPACM_SUCCESS; -} - -/*handle reset usb-client rt-rules */ -int IPACM_Lan::handle_tethering_stats_event(ipa_get_data_stats_resp_msg_v01 *data) -{ - int cnt, pipe_len, fd; - uint64_t num_ul_packets, num_ul_bytes; - uint64_t num_dl_packets, num_dl_bytes; - bool ul_pipe_found, dl_pipe_found; - FILE *fp = NULL; - - fd = open(IPA_DEVICE_NAME, O_RDWR); - if (fd < 0) - { - IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); - return IPACM_FAILURE; - } - - - ul_pipe_found = false; - dl_pipe_found = false; - num_ul_packets = 0; - num_dl_packets = 0; - num_ul_bytes = 0; - num_dl_bytes = 0; - - if (data->dl_dst_pipe_stats_list_valid) - { - if(tx_prop != NULL) - { - for (pipe_len = 0; pipe_len < data->dl_dst_pipe_stats_list_len; pipe_len++) - { - IPACMDBG_H("Check entry(%d) dl_dst_pipe(%d)\n", pipe_len, data->dl_dst_pipe_stats_list[pipe_len].pipe_index); - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - IPACMDBG_H("Check Tx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe)); - if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe) == data->dl_dst_pipe_stats_list[pipe_len].pipe_index) - { - /* update the DL stats */ - dl_pipe_found = true; - num_dl_packets += data->dl_dst_pipe_stats_list[pipe_len].num_ipv4_packets; - num_dl_packets += data->dl_dst_pipe_stats_list[pipe_len].num_ipv6_packets; - num_dl_bytes += data->dl_dst_pipe_stats_list[pipe_len].num_ipv4_bytes; - num_dl_bytes += data->dl_dst_pipe_stats_list[pipe_len].num_ipv6_bytes; - IPACMDBG_H("Got matched dst-pipe (%d) from %d tx props\n", data->dl_dst_pipe_stats_list[pipe_len].pipe_index, cnt); - IPACMDBG_H("DL_packets:(%lu) DL_bytes:(%lu) \n", num_dl_packets, num_dl_bytes); - break; - } - } - } - } - } - - if (data->ul_src_pipe_stats_list_valid) - { - if(rx_prop != NULL) - { - for (pipe_len = 0; pipe_len < data->ul_src_pipe_stats_list_len; pipe_len++) - { - IPACMDBG_H("Check entry(%d) dl_dst_pipe(%d)\n", pipe_len, data->ul_src_pipe_stats_list[pipe_len].pipe_index); - for (cnt=0; cnt < rx_prop->num_rx_props; cnt++) - { - IPACMDBG_H("Check Rx_prop_entry(%d) pipe(%d)\n", cnt, ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe)); - if(ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe) == data->ul_src_pipe_stats_list[pipe_len].pipe_index) - { - /* update the UL stats */ - ul_pipe_found = true; - num_ul_packets += data->ul_src_pipe_stats_list[pipe_len].num_ipv4_packets; - num_ul_packets += data->ul_src_pipe_stats_list[pipe_len].num_ipv6_packets; - num_ul_bytes += data->ul_src_pipe_stats_list[pipe_len].num_ipv4_bytes; - num_ul_bytes += data->ul_src_pipe_stats_list[pipe_len].num_ipv6_bytes; - IPACMDBG_H("Got matched dst-pipe (%d) from %d tx props\n", data->ul_src_pipe_stats_list[pipe_len].pipe_index, cnt); - IPACMDBG_H("UL_packets:(%lu) UL_bytes:(%lu) \n", num_ul_packets, num_ul_bytes); - break; - } - } - } - } - } - close(fd); - - if (ul_pipe_found || dl_pipe_found) - { - IPACMDBG_H("Update IPA_TETHERING_STATS_UPDATE_EVENT, TX(P%lu/B%lu) RX(P%lu/B%lu) DEV(%s) to LTE(%s) \n", - num_ul_packets, - num_ul_bytes, - num_dl_packets, - num_dl_bytes, - dev_name, - IPACM_Wan::wan_up_dev_name); - fp = fopen(IPA_PIPE_STATS_FILE_NAME, "w"); - if ( fp == NULL ) - { - IPACMERR("Failed to write pipe stats to %s, error is %d - %s\n", - IPA_PIPE_STATS_FILE_NAME, errno, strerror(errno)); - return IPACM_FAILURE; - } - - fprintf(fp, PIPE_STATS, - dev_name, - IPACM_Wan::wan_up_dev_name, - num_ul_bytes, - num_ul_packets, - num_dl_bytes, - num_dl_packets); - fclose(fp); - } - return IPACM_SUCCESS; -} - -/*handle tether client */ -int IPACM_Lan::handle_tethering_client(bool reset, ipacm_client_enum ipa_client) -{ - int cnt, fd, ret = IPACM_SUCCESS; - int fd_wwan_ioctl = open(WWAN_QMI_IOCTL_DEVICE_NAME, O_RDWR); - wan_ioctl_set_tether_client_pipe tether_client; - - if(fd_wwan_ioctl < 0) - { - IPACMERR("Failed to open %s.\n",WWAN_QMI_IOCTL_DEVICE_NAME); - return IPACM_FAILURE; - } - - fd = open(IPA_DEVICE_NAME, O_RDWR); - if (fd < 0) - { - IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); - close(fd_wwan_ioctl); - return IPACM_FAILURE; - } - - memset(&tether_client, 0, sizeof(tether_client)); - tether_client.reset_client = reset; - tether_client.ipa_client = ipa_client; - - if(tx_prop != NULL) - { - tether_client.dl_dst_pipe_len = tx_prop->num_tx_props; - for (cnt = 0; cnt < tx_prop->num_tx_props; cnt++) - { - IPACMDBG_H("Tx(%d), dst_pipe: %d, ipa_pipe: %d\n", - cnt, tx_prop->tx[cnt].dst_pipe, - ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe)); - tether_client.dl_dst_pipe_list[cnt] = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, tx_prop->tx[cnt].dst_pipe); - } - } - - if(rx_prop != NULL) - { - tether_client.ul_src_pipe_len = rx_prop->num_rx_props; - for (cnt = 0; cnt < rx_prop->num_rx_props; cnt++) - { - IPACMDBG_H("Rx(%d), src_pipe: %d, ipa_pipe: %d\n", - cnt, rx_prop->rx[cnt].src_pipe, - ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe)); - tether_client.ul_src_pipe_list[cnt] = ioctl(fd, IPA_IOC_QUERY_EP_MAPPING, rx_prop->rx[cnt].src_pipe); - } - } - - ret = ioctl(fd_wwan_ioctl, WAN_IOC_SET_TETHER_CLIENT_PIPE, &tether_client); - if (ret != 0) - { - IPACMERR("Failed set tether-client-pipe %p with ret %d\n ", &tether_client, ret); - } - IPACMDBG("Set tether-client-pipe %p\n", &tether_client); - close(fd); - close(fd_wwan_ioctl); - return ret; -} - -/* mac address has to be provided for client related events */ -void IPACM_Lan::eth_bridge_post_event(ipa_cm_event_id evt, ipa_ip_type iptype, uint8_t *mac) -{ - ipacm_cmd_q_data eth_bridge_evt; - ipacm_event_eth_bridge *evt_data; - - evt_data = (ipacm_event_eth_bridge*)malloc(sizeof(ipacm_event_eth_bridge)); - if(evt_data == NULL) - { - IPACMERR("Failed to allocate memory.\n"); - return; - } - memset(evt_data, 0, sizeof(ipacm_event_eth_bridge)); - - evt_data->p_iface = this; - evt_data->iptype = iptype; - if(mac) - { - IPACMDBG_H("Client mac: 0x%02x%02x%02x%02x%02x%02x \n", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - memcpy(evt_data->mac_addr, mac, sizeof(evt_data->mac_addr)); - } - - memset(ð_bridge_evt, 0, sizeof(ipacm_cmd_q_data)); - eth_bridge_evt.evt_data = (void*)evt_data; - eth_bridge_evt.event = evt; - - IPACMDBG_H("Posting event %s\n", - IPACM_Iface::ipacmcfg->getEventName(evt)); - IPACM_EvtDispatcher::PostEvt(ð_bridge_evt); -} - -/* add header processing context and return handle to lan2lan controller */ -int IPACM_Lan::eth_bridge_add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_hdr_type, uint32_t *hdl) -{ - int len, res = IPACM_SUCCESS; - uint32_t hdr_template; - ipa_ioc_add_hdr_proc_ctx* pHeaderProcTable = NULL; - - if(tx_prop == NULL) - { - IPACMERR("No tx prop.\n"); - return IPACM_FAILURE; - } - - len = sizeof(struct ipa_ioc_add_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_add); - pHeaderProcTable = (ipa_ioc_add_hdr_proc_ctx*)malloc(len); - if(pHeaderProcTable == NULL) - { - IPACMERR("Cannot allocate header processing context table.\n"); - return IPACM_FAILURE; - } - - memset(pHeaderProcTable, 0, len); - pHeaderProcTable->commit = 1; - pHeaderProcTable->num_proc_ctxs = 1; - pHeaderProcTable->proc_ctx[0].type = eth_bridge_get_hdr_proc_type(peer_l2_hdr_type, tx_prop->tx[0].hdr_l2_type); - eth_bridge_get_hdr_template_hdl(&hdr_template); - pHeaderProcTable->proc_ctx[0].hdr_hdl = hdr_template; - if (m_header.AddHeaderProcCtx(pHeaderProcTable) == false) - { - IPACMERR("Adding hdr proc ctx failed with status: %d\n", pHeaderProcTable->proc_ctx[0].status); - res = IPACM_FAILURE; - goto end; - } - - *hdl = pHeaderProcTable->proc_ctx[0].proc_ctx_hdl; - -end: - free(pHeaderProcTable); - return res; -} - -/* add routing rule and return handle to lan2lan controller */ -int IPACM_Lan::eth_bridge_add_rt_rule(uint8_t *mac, char *rt_tbl_name, uint32_t hdr_proc_ctx_hdl, - ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int *rt_rule_count) -{ - int i, len, res = IPACM_SUCCESS; - struct ipa_ioc_add_rt_rule* rt_rule_table = NULL; - struct ipa_rt_rule_add rt_rule; - int position, num_rt_rule; - - IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - num_rt_rule = each_client_rt_rule_count[iptype]; - - len = sizeof(ipa_ioc_add_rt_rule) + num_rt_rule * sizeof(ipa_rt_rule_add); - rt_rule_table = (ipa_ioc_add_rt_rule*)malloc(len); - if (rt_rule_table == NULL) - { - IPACMERR("Failed to allocate memory.\n"); - return IPACM_FAILURE; - } - memset(rt_rule_table, 0, len); - - rt_rule_table->commit = 1; - rt_rule_table->ip = iptype; - rt_rule_table->num_rules = num_rt_rule; - strlcpy(rt_rule_table->rt_tbl_name, rt_tbl_name, sizeof(rt_rule_table->rt_tbl_name)); - rt_rule_table->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = 0; - - memset(&rt_rule, 0, sizeof(ipa_rt_rule_add)); - rt_rule.at_rear = false; - rt_rule.status = -1; - rt_rule.rt_rule_hdl = -1; -#ifdef FEATURE_IPA_V3 - rt_rule.rule.hashable = true; -#endif - rt_rule.rule.hdr_hdl = 0; - rt_rule.rule.hdr_proc_ctx_hdl = hdr_proc_ctx_hdl; - - position = 0; - for(i=0; i<iface_query->num_tx_props; i++) - { - if(tx_prop->tx[i].ip == iptype) - { - if(position >= num_rt_rule || position >= MAX_NUM_PROP) - { - IPACMERR("Number of routing rules already exceeds limit.\n"); - res = IPACM_FAILURE; - goto end; - } - - if(ipa_if_cate == WLAN_IF && IPACM_Iface::ipacmcfg->isMCC_Mode) - { - IPACMDBG_H("In WLAN MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[i].alt_dst_pipe); - rt_rule.rule.dst = tx_prop->tx[i].alt_dst_pipe; - } - else - { - IPACMDBG_H("It is not WLAN MCC mode, use dst pipe: %d\n", - tx_prop->tx[i].dst_pipe); - rt_rule.rule.dst = tx_prop->tx[i].dst_pipe; - } - - memcpy(&rt_rule.rule.attrib, &tx_prop->tx[i].attrib, sizeof(rt_rule.rule.attrib)); - if(peer_l2_hdr_type == IPA_HDR_L2_ETHERNET_II) - rt_rule.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_ETHER_II; - else - rt_rule.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_802_3; - memcpy(rt_rule.rule.attrib.dst_mac_addr, mac, sizeof(rt_rule.rule.attrib.dst_mac_addr)); - memset(rt_rule.rule.attrib.dst_mac_addr_mask, 0xFF, sizeof(rt_rule.rule.attrib.dst_mac_addr_mask)); - - memcpy(&(rt_rule_table->rules[position]), &rt_rule, sizeof(rt_rule_table->rules[position])); - position++; - } - } - if(false == m_routing.AddRoutingRule(rt_rule_table)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto end; - } - else - { - *rt_rule_count = position; - for(i=0; i<position; i++) - rt_rule_hdl[i] = rt_rule_table->rules[i].rt_rule_hdl; - } - -end: - free(rt_rule_table); - return res; -} - -/* modify routing rule*/ -int IPACM_Lan::eth_bridge_modify_rt_rule(uint8_t *mac, uint32_t hdr_proc_ctx_hdl, - ipa_hdr_l2_type peer_l2_hdr_type, ipa_ip_type iptype, uint32_t *rt_rule_hdl, int rt_rule_count) -{ - struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL; - struct ipa_rt_rule_mdfy *rt_rule_entry; - int len, index, res = IPACM_SUCCESS; - - if(tx_prop == NULL) - { - IPACMDBG_H("No tx properties \n"); - return IPACM_FAILURE; - } - - if(ipa_if_cate != WLAN_IF) - { - IPACMDBG_H("This is not WLAN IF, no need to modify rt rule.\n"); - return IPACM_SUCCESS; - } - - IPACMDBG_H("Receive WLAN client MAC 0x%02x%02x%02x%02x%02x%02x.\n", - mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - len = sizeof(struct ipa_ioc_mdfy_rt_rule) + rt_rule_count * sizeof(struct ipa_rt_rule_mdfy); - rt_rule = (struct ipa_ioc_mdfy_rt_rule *)malloc(len); - if(rt_rule == NULL) - { - IPACMERR("Unable to allocate memory for modify rt rule\n"); - return IPACM_FAILURE; - } - memset(rt_rule, 0, len); - - rt_rule->commit = 1; - rt_rule->num_rules = 0; - rt_rule->ip = iptype; - - for (index = 0; index < tx_prop->num_tx_props; index++) - { - if (tx_prop->tx[index].ip == iptype) - { - if (rt_rule->num_rules >= rt_rule_count || - rt_rule->num_rules >= MAX_NUM_PROP) - { - IPACMERR("Number of routing rules exceeds limit.\n"); - res = IPACM_FAILURE; - goto end; - } - - rt_rule_entry = &rt_rule->rules[rt_rule->num_rules]; - - if (IPACM_Iface::ipacmcfg->isMCC_Mode) - { - IPACMDBG_H("In WLAN MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[index].alt_dst_pipe; - } - else - { - IPACMDBG_H("In WLAN SCC mode, use dst pipe: %d\n", - tx_prop->tx[index].dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[index].dst_pipe; - } - - rt_rule_entry->rule.hdr_hdl = 0; - rt_rule_entry->rule.hdr_proc_ctx_hdl = hdr_proc_ctx_hdl; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - memcpy(&rt_rule_entry->rule.attrib, &tx_prop->tx[index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - if(peer_l2_hdr_type == IPA_HDR_L2_ETHERNET_II) - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_ETHER_II; - else - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_802_3; - memcpy(rt_rule_entry->rule.attrib.dst_mac_addr, mac, - sizeof(rt_rule_entry->rule.attrib.dst_mac_addr)); - memset(rt_rule_entry->rule.attrib.dst_mac_addr_mask, 0xFF, - sizeof(rt_rule_entry->rule.attrib.dst_mac_addr_mask)); - - rt_rule_entry->rt_rule_hdl = rt_rule_hdl[rt_rule->num_rules]; - rt_rule->num_rules++; - } - } - - if(m_routing.ModifyRoutingRule(rt_rule) == false) - { - IPACMERR("Failed to modify routing rules.\n"); - res = IPACM_FAILURE; - goto end; - } - if(m_routing.Commit(iptype) == false) - { - IPACMERR("Failed to commit routing rules.\n"); - res = IPACM_FAILURE; - goto end; - } - IPACMDBG("Modified routing rules successfully.\n"); - -end: - free(rt_rule); - return res; -} - -int IPACM_Lan::eth_bridge_add_flt_rule(uint8_t *mac, uint32_t rt_tbl_hdl, ipa_ip_type iptype, uint32_t *flt_rule_hdl) -{ - int len, res = IPACM_SUCCESS; - struct ipa_flt_rule_add flt_rule_entry; - struct ipa_ioc_add_flt_rule_after *pFilteringTable = NULL; - -#ifdef FEATURE_IPA_V3 - if (rx_prop == NULL || tx_prop == NULL) - { - IPACMDBG_H("No rx or tx properties registered for iface %s\n", dev_name); - return IPACM_FAILURE; - } - - IPACMDBG_H("Received client MAC 0x%02x%02x%02x%02x%02x%02x.\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - - len = sizeof(struct ipa_ioc_add_flt_rule_after) + sizeof(struct ipa_flt_rule_add); - pFilteringTable = (struct ipa_ioc_add_flt_rule_after*)malloc(len); - if (!pFilteringTable) - { - IPACMERR("Failed to allocate ipa_ioc_add_flt_rule_after memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable, 0, len); - - /* add mac based rule*/ - pFilteringTable->commit = 1; - pFilteringTable->ep = rx_prop->rx[0].src_pipe; - pFilteringTable->ip = iptype; - pFilteringTable->num_rules = 1; - pFilteringTable->add_after_hdl = eth_bridge_flt_rule_offset[iptype]; - - memset(&flt_rule_entry, 0, sizeof(flt_rule_entry)); - flt_rule_entry.at_rear = 1; - - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.rule.rt_tbl_hdl = rt_tbl_hdl; - flt_rule_entry.rule.hashable = true; - - memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); - if(tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_ETHERNET_II) - { - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_ETHER_II; - } - else - { - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_MAC_DST_ADDR_802_3; - } - - memcpy(flt_rule_entry.rule.attrib.dst_mac_addr, mac, sizeof(flt_rule_entry.rule.attrib.dst_mac_addr)); - memset(flt_rule_entry.rule.attrib.dst_mac_addr_mask, 0xFF, sizeof(flt_rule_entry.rule.attrib.dst_mac_addr_mask)); - - memcpy(&(pFilteringTable->rules[0]), &flt_rule_entry, sizeof(flt_rule_entry)); - if (false == m_filtering.AddFilteringRuleAfter(pFilteringTable)) - { - IPACMERR("Failed to add client filtering rules.\n"); - res = IPACM_FAILURE; - goto end; - } - *flt_rule_hdl = pFilteringTable->rules[0].flt_rule_hdl; - -end: - free(pFilteringTable); -#endif - return res; -} - -int IPACM_Lan::eth_bridge_del_flt_rule(uint32_t flt_rule_hdl, ipa_ip_type iptype) -{ - if(m_filtering.DeleteFilteringHdls(&flt_rule_hdl, iptype, 1) == false) - { - IPACMERR("Failed to delete the client specific flt rule.\n"); - return IPACM_FAILURE; - } - return IPACM_SUCCESS; -} - -int IPACM_Lan::eth_bridge_del_rt_rule(uint32_t rt_rule_hdl, ipa_ip_type iptype) -{ - if(m_routing.DeleteRoutingHdl(rt_rule_hdl, iptype) == false) - { - IPACMERR("Failed to delete routing rule.\n"); - return IPACM_FAILURE; - } - return IPACM_SUCCESS; -} - -/* delete header processing context */ -int IPACM_Lan::eth_bridge_del_hdr_proc_ctx(uint32_t hdr_proc_ctx_hdl) -{ - if(m_header.DeleteHeaderProcCtx(hdr_proc_ctx_hdl) == false) - { - IPACMERR("Failed to delete hdr proc ctx.\n"); - return IPACM_FAILURE; - } - return IPACM_SUCCESS; -} diff --git a/ipacm/src/IPACM_LanToLan.cpp b/ipacm/src/IPACM_LanToLan.cpp deleted file mode 100644 index d77f389..0000000 --- a/ipacm/src/IPACM_LanToLan.cpp +++ /dev/null @@ -1,1262 +0,0 @@ -/* -Copyright (c) 2014, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_LanToLan.cpp - - @brief - This file implements the functionality of offloading LAN to LAN traffic. - - @Author - Shihuan Liu - -*/ - -#include <stdlib.h> -#include "IPACM_LanToLan.h" -#include "IPACM_Wlan.h" - -#define __stringify(x...) #x - -const char *ipa_l2_hdr_type[] = { - __stringify(NONE), - __stringify(ETH_II), - __stringify(802_3), - __stringify(L2_MAX) -}; - -IPACM_LanToLan_Iface::IPACM_LanToLan_Iface(IPACM_Lan *p_iface) -{ - int i; - - m_p_iface = p_iface; - memset(m_is_ip_addr_assigned, 0, sizeof(m_is_ip_addr_assigned)); - m_support_inter_iface_offload = true; - m_support_intra_iface_offload = false; - for(i = 0; i < IPA_HDR_L2_MAX; i++) - { - ref_cnt_peer_l2_hdr_type[i] = 0; - hdr_proc_ctx_for_inter_interface[i] = 0; - } - hdr_proc_ctx_for_intra_interface = 0; - - if(p_iface->ipa_if_cate == WLAN_IF) - { - IPACMDBG_H("Interface %s is WLAN interface.\n", p_iface->dev_name); - m_support_intra_iface_offload = true; - if( ((IPACM_Wlan*)p_iface)->is_guest_ap() ) - { - IPACMDBG_H("Interface %s is guest AP.\n", p_iface->dev_name); - m_support_inter_iface_offload = false; - } - } - return; -} - -IPACM_LanToLan_Iface::~IPACM_LanToLan_Iface() -{ -} - -IPACM_LanToLan::IPACM_LanToLan() -{ - IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_IFACE_UP, this); - IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_IFACE_DOWN, this); - IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_CLIENT_ADD, this); - IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_CLIENT_DEL, this); - IPACM_EvtDispatcher::registr(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, this); - - return; -} - -IPACM_LanToLan::~IPACM_LanToLan() -{ - IPACMDBG_DMESG("WARNING: UNEXPECTEDLY KILL LAN2LAN CONTROLLER!\n"); - return; -} - -void IPACM_LanToLan::event_callback(ipa_cm_event_id event, void* param) -{ - ipacm_event_eth_bridge *data = (ipacm_event_eth_bridge*)param; - IPACMDBG_H("Get %s event.\n", IPACM_Iface::ipacmcfg->getEventName(event)); - - switch(event) - { - case IPA_ETH_BRIDGE_IFACE_UP: - { - handle_iface_up(data); - break; - } - - case IPA_ETH_BRIDGE_IFACE_DOWN: - { - handle_iface_down(data); - break; - } - - case IPA_ETH_BRIDGE_CLIENT_ADD: - { - handle_client_add(data); - break; - } - - case IPA_ETH_BRIDGE_CLIENT_DEL: - { - handle_client_del(data); - break; - } - - case IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH: - { - handle_wlan_scc_mcc_switch(data); - break; - } - default: - break; - } - - print_data_structure_info(); - return; -} - -void IPACM_LanToLan::handle_iface_up(ipacm_event_eth_bridge *data) -{ - list<IPACM_LanToLan_Iface>::iterator it; - - IPACMDBG_H("Interface name: %s IP type: %d\n", data->p_iface->dev_name, data->iptype); - for(it = m_iface.begin(); it != m_iface.end(); it++) - { - if(it->get_iface_pointer() == data->p_iface) - { - IPACMDBG_H("Found the interface.\n"); - if(it->get_m_is_ip_addr_assigned(data->iptype) == false) - { - IPACMDBG_H("IP type %d was not active before, activating it now.\n", data->iptype); - it->set_m_is_ip_addr_assigned(data->iptype, true); - - /* install inter-interface rules */ - if(it->get_m_support_inter_iface_offload()) - it->add_all_inter_interface_client_flt_rule(data->iptype); - - /* install intra-BSS rules */ - if(it->get_m_support_intra_iface_offload()) - it->add_all_intra_interface_client_flt_rule(data->iptype); - } - break; - } - } - - if(it == m_iface.end()) //If the interface has not been created before - { - if(m_iface.size() == MAX_NUM_IFACE) - { - IPACMERR("The number of interfaces has reached maximum %d.\n", MAX_NUM_IFACE); - return; - } - - if(!data->p_iface->tx_prop || !data->p_iface->rx_prop) - { - IPACMERR("The interface %s does not have tx_prop or rx_prop.\n", data->p_iface->dev_name); - return; - } - - if(data->p_iface->tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_NONE || data->p_iface->tx_prop->tx[0].hdr_l2_type == IPA_HDR_L2_MAX) - { - IPACMERR("Invalid l2 header type %s!\n", ipa_l2_hdr_type[data->p_iface->tx_prop->tx[0].hdr_l2_type]); - return; - } - - IPACMDBG_H("Does not find the interface, insert a new one.\n"); - IPACM_LanToLan_Iface new_iface(data->p_iface); - new_iface.set_m_is_ip_addr_assigned(data->iptype, true); - - m_iface.push_front(new_iface); - IPACMDBG_H("Now the total number of interfaces is %d.\n", m_iface.size()); - - IPACM_LanToLan_Iface &front_iface = m_iface.front(); - - /* install inter-interface rules */ - if(front_iface.get_m_support_inter_iface_offload()) - { - for(it = ++m_iface.begin(); it != m_iface.end(); it++) - { - /* add peer info only when both interfaces support inter-interface communication */ - if(it->get_m_support_inter_iface_offload()) - { - /* populate hdr_proc_ctx and routing table handle */ - handle_new_iface_up(&front_iface, &(*it)); - - /* add client specific routing rule on existing interface */ - it->add_client_rt_rule_for_new_iface(); - } - } - - /* add client specific filtering rule on new interface */ - front_iface.add_all_inter_interface_client_flt_rule(data->iptype); - } - - /* populate the intra-interface information */ - if(front_iface.get_m_support_intra_iface_offload()) - { - front_iface.handle_intra_interface_info(); - } - - /* handle cached client add event */ - handle_cached_client_add_event(front_iface.get_iface_pointer()); - } - return; -} - -void IPACM_LanToLan::handle_iface_down(ipacm_event_eth_bridge *data) -{ - list<IPACM_LanToLan_Iface>::iterator it_target_iface; - - IPACMDBG_H("Interface name: %s\n", data->p_iface->dev_name); - - for(it_target_iface = m_iface.begin(); it_target_iface != m_iface.end(); it_target_iface++) - { - if(it_target_iface->get_iface_pointer() == data->p_iface) - { - IPACMDBG_H("Found the interface.\n"); - break; - } - } - - if(it_target_iface == m_iface.end()) - { - IPACMDBG_H("The interface has not been found.\n"); - /* clear cached client add event for the unfound interface*/ - clear_cached_client_add_event(data->p_iface); - return; - } - - it_target_iface->handle_down_event(); - m_iface.erase(it_target_iface); - - return; -} - -void IPACM_LanToLan::handle_new_iface_up(IPACM_LanToLan_Iface *new_iface, IPACM_LanToLan_Iface *exist_iface) -{ - char rt_tbl_name_for_flt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX]; - char rt_tbl_name_for_rt[IPA_IP_MAX][IPA_RESOURCE_NAME_MAX]; - - IPACMDBG_H("Populate peer info between: new_iface %s, existing iface %s\n", new_iface->get_iface_pointer()->dev_name, - exist_iface->get_iface_pointer()->dev_name); - - /* populate the routing table information */ - snprintf(rt_tbl_name_for_flt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX, "eth_v4_%s_to_%s", - ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type], - ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]); - IPACMDBG_H("IPv4 routing table for flt name: %s\n", rt_tbl_name_for_flt[IPA_IP_v4]); - - snprintf(rt_tbl_name_for_flt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX, "eth_v6_%s_to_%s", - ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type], - ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]); - IPACMDBG_H("IPv6 routing table for flt name: %s\n", rt_tbl_name_for_flt[IPA_IP_v6]); - - snprintf(rt_tbl_name_for_rt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX, "eth_v4_%s_to_%s", - ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type], - ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]); - IPACMDBG_H("IPv4 routing table for rt name: %s\n", rt_tbl_name_for_rt[IPA_IP_v4]); - - snprintf(rt_tbl_name_for_rt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX, "eth_v6_%s_to_%s", - ipa_l2_hdr_type[new_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type], - ipa_l2_hdr_type[exist_iface->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type]); - IPACMDBG_H("IPv6 routing table for rt name: %s\n", rt_tbl_name_for_rt[IPA_IP_v6]); - - /* add new peer info in both new iface and existing iface */ - exist_iface->handle_new_iface_up(rt_tbl_name_for_flt, rt_tbl_name_for_rt, new_iface); - - new_iface->handle_new_iface_up(rt_tbl_name_for_rt, rt_tbl_name_for_flt, exist_iface); - - return; -} - -void IPACM_LanToLan::handle_client_add(ipacm_event_eth_bridge *data) -{ - list<IPACM_LanToLan_Iface>::iterator it_iface; - - IPACMDBG_H("Incoming client MAC: 0x%02x%02x%02x%02x%02x%02x, interface: %s\n", data->mac_addr[0], data->mac_addr[1], - data->mac_addr[2], data->mac_addr[3], data->mac_addr[4], data->mac_addr[5], data->p_iface->dev_name); - - for(it_iface = m_iface.begin(); it_iface != m_iface.end(); it_iface++) - { - if(it_iface->get_iface_pointer() == data->p_iface) //find the interface - { - IPACMDBG_H("Found the interface.\n"); - it_iface->handle_client_add(data->mac_addr); - break; - } - } - - /* if the iface was not found, cache the client add event */ - if(it_iface == m_iface.end()) - { - IPACMDBG_H("The interface is not found.\n"); - if(m_cached_client_add_event.size() < MAX_NUM_CACHED_CLIENT_ADD_EVENT) - { - IPACMDBG_H("Cached the client information.\n"); - m_cached_client_add_event.push_front(*data); - } - else - { - IPACMDBG_H("Cached client add event has reached maximum number.\n"); - } - } - return; -} - -void IPACM_LanToLan::handle_client_del(ipacm_event_eth_bridge *data) -{ - list<IPACM_LanToLan_Iface>::iterator it_iface; - - IPACMDBG_H("Incoming client MAC: 0x%02x%02x%02x%02x%02x%02x, interface: %s\n", data->mac_addr[0], data->mac_addr[1], - data->mac_addr[2], data->mac_addr[3], data->mac_addr[4], data->mac_addr[5], data->p_iface->dev_name); - - for(it_iface = m_iface.begin(); it_iface != m_iface.end(); it_iface++) - { - if(it_iface->get_iface_pointer() == data->p_iface) //found the interface - { - IPACMDBG_H("Found the interface.\n"); - it_iface->handle_client_del(data->mac_addr); - break; - } - } - - if(it_iface == m_iface.end()) - { - IPACMDBG_H("The interface is not found.\n"); - } - - return; -} - -void IPACM_LanToLan::handle_wlan_scc_mcc_switch(ipacm_event_eth_bridge *data) -{ - list<IPACM_LanToLan_Iface>::iterator it_iface; - - IPACMDBG_H("Incoming interface: %s\n", data->p_iface->dev_name); - for(it_iface = m_iface.begin(); it_iface != m_iface.end(); it_iface++) - { - if(it_iface->get_iface_pointer() == data->p_iface) - { - it_iface->handle_wlan_scc_mcc_switch(); - break; - } - } - return; -} - -void IPACM_LanToLan::handle_cached_client_add_event(IPACM_Lan *p_iface) -{ - list<ipacm_event_eth_bridge>::iterator it; - - it = m_cached_client_add_event.begin(); - while(it != m_cached_client_add_event.end()) - { - if(it->p_iface == p_iface) - { - IPACMDBG_H("Found client with MAC: 0x%02x%02x%02x%02x%02x%02x\n", it->mac_addr[0], it->mac_addr[1], - it->mac_addr[2], it->mac_addr[3], it->mac_addr[4], it->mac_addr[5]); - handle_client_add(&(*it)); - it = m_cached_client_add_event.erase(it); - } - else - { - it++; - } - } - return; -} - -void IPACM_LanToLan::clear_cached_client_add_event(IPACM_Lan *p_iface) -{ - list<ipacm_event_eth_bridge>::iterator it; - - it = m_cached_client_add_event.begin(); - while(it != m_cached_client_add_event.end()) - { - if(it->p_iface == p_iface) - { - IPACMDBG_H("Found client with MAC: 0x%02x%02x%02x%02x%02x%02x\n", it->mac_addr[0], it->mac_addr[1], - it->mac_addr[2], it->mac_addr[3], it->mac_addr[4], it->mac_addr[5]); - it = m_cached_client_add_event.erase(it); - } - else - { - it++; - } - } - return; -} - -void IPACM_LanToLan::print_data_structure_info() -{ - list<IPACM_LanToLan_Iface>::iterator it; - list<ipacm_event_eth_bridge>::iterator it_event; - int i; - - IPACMDBG_H("There are %d interfaces in total.\n", m_iface.size()); - - for(it = m_iface.begin(); it != m_iface.end(); it++) - { - it->print_data_structure_info(); - } - - IPACMDBG_H("There are %d cached client add events in total.\n", m_cached_client_add_event.size()); - - i = 1; - for(it_event = m_cached_client_add_event.begin(); it_event != m_cached_client_add_event.end(); it_event++) - { - IPACMDBG_H("Client %d MAC: 0x%02x%02x%02x%02x%02x%02x, interface: %s\n", i, it_event->mac_addr[0], it_event->mac_addr[1], it_event->mac_addr[2], - it_event->mac_addr[3], it_event->mac_addr[4], it_event->mac_addr[5], it_event->p_iface->dev_name); - i++; - } - - return; -} - -void IPACM_LanToLan_Iface::add_client_rt_rule_for_new_iface() -{ - list<client_info>::iterator it; - ipa_hdr_l2_type peer_l2_type; - peer_iface_info &peer = m_peer_iface_info.front(); - - peer_l2_type = peer.peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type; - if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 1) - { - for(it = m_client_info.begin(); it != m_client_info.end(); it++) - { - add_client_rt_rule(&peer, &(*it)); - } - } - - return; -} - -void IPACM_LanToLan_Iface::add_client_rt_rule(peer_iface_info *peer_info, client_info *client) -{ - int i, num_rt_rule; - uint32_t rt_rule_hdl[MAX_NUM_PROP]; - ipa_hdr_l2_type peer_l2_hdr_type; - - peer_l2_hdr_type = peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type; - - /* if the peer info is not for intra interface communication */ - if(peer_info->peer != this) - { - IPACMDBG_H("This is for inter interface communication.\n"); - - m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v4], hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type], - peer_l2_hdr_type, IPA_IP_v4, rt_rule_hdl, &num_rt_rule); - - client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4] = num_rt_rule; - IPACMDBG_H("Number of IPv4 routing rule is %d.\n", num_rt_rule); - for(i=0; i<num_rt_rule; i++) - { - IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]); - client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i] = rt_rule_hdl[i]; - } - - m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v6], hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type], - peer_l2_hdr_type, IPA_IP_v6, rt_rule_hdl, &num_rt_rule); - - client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6] = num_rt_rule; - IPACMDBG_H("Number of IPv6 routing rule is %d.\n", num_rt_rule); - for(i=0; i<num_rt_rule; i++) - { - IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]); - client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i] = rt_rule_hdl[i]; - } - } - else - { - IPACMDBG_H("This is for intra interface communication.\n"); - m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v4], hdr_proc_ctx_for_intra_interface, - peer_l2_hdr_type, IPA_IP_v4, rt_rule_hdl, &num_rt_rule); - - client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4] = num_rt_rule; - IPACMDBG_H("Number of IPv4 routing rule is %d.\n", num_rt_rule); - for(i=0; i<num_rt_rule; i++) - { - IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]); - client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i] = rt_rule_hdl[i]; - } - - m_p_iface->eth_bridge_add_rt_rule(client->mac_addr, peer_info->rt_tbl_name_for_rt[IPA_IP_v6], hdr_proc_ctx_for_intra_interface, - peer_l2_hdr_type, IPA_IP_v6, rt_rule_hdl, &num_rt_rule); - - client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6] = num_rt_rule; - IPACMDBG_H("Number of IPv6 routing rule is %d.\n", num_rt_rule); - for(i=0; i<num_rt_rule; i++) - { - IPACMDBG_H("Routing rule %d handle %d\n", i, rt_rule_hdl[i]); - client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i] = rt_rule_hdl[i]; - } - } - - return; -} - -void IPACM_LanToLan_Iface::add_all_inter_interface_client_flt_rule(ipa_ip_type iptype) -{ - list<peer_iface_info>::iterator it_iface; - list<client_info>::iterator it_client; - - for(it_iface = m_peer_iface_info.begin(); it_iface != m_peer_iface_info.end(); it_iface++) - { - IPACMDBG_H("Add flt rules for clients of interface %s.\n", it_iface->peer->get_iface_pointer()->dev_name); - for(it_client = it_iface->peer->m_client_info.begin(); it_client != it_iface->peer->m_client_info.end(); it_client++) - { - add_client_flt_rule(&(*it_iface), &(*it_client), iptype); - } - } - return; -} - -void IPACM_LanToLan_Iface::add_all_intra_interface_client_flt_rule(ipa_ip_type iptype) -{ - list<client_info>::iterator it_client; - - IPACMDBG_H("Add flt rules for own clients.\n"); - for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++) - { - add_client_flt_rule(&m_intra_interface_info, &(*it_client), iptype); - } - - return; -} - -void IPACM_LanToLan_Iface::add_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client) -{ - list<peer_iface_info>::iterator it; - - for(it = m_peer_iface_info.begin(); it != m_peer_iface_info.end(); it++) - { - if(it->peer == peer_iface) - { - IPACMDBG_H("Found the peer iface info.\n"); - if(m_is_ip_addr_assigned[IPA_IP_v4]) - { - add_client_flt_rule(&(*it), client, IPA_IP_v4); - } - if(m_is_ip_addr_assigned[IPA_IP_v6]) - { - add_client_flt_rule(&(*it), client, IPA_IP_v6); - } - - break; - } - } - return; -} - -void IPACM_LanToLan_Iface::add_client_flt_rule(peer_iface_info *peer, client_info *client, ipa_ip_type iptype) -{ - list<flt_rule_info>::iterator it_flt; - uint32_t flt_rule_hdl; - flt_rule_info new_flt_info; - ipa_ioc_get_rt_tbl rt_tbl; - - rt_tbl.ip = iptype; - memcpy(rt_tbl.name, peer->rt_tbl_name_for_flt[iptype], sizeof(rt_tbl.name)); - IPACMDBG_H("This flt rule points to rt tbl %s.\n", rt_tbl.name); - - if(IPACM_Iface::m_routing.GetRoutingTable(&rt_tbl) == false) - { - IPACMERR("Failed to get routing table.\n"); - return; - } - - m_p_iface->eth_bridge_add_flt_rule(client->mac_addr, rt_tbl.hdl, - iptype, &flt_rule_hdl); - IPACMDBG_H("Installed flt rule for IP type %d: handle %d\n", iptype, flt_rule_hdl); - - for(it_flt = peer->flt_rule.begin(); it_flt != peer->flt_rule.end(); it_flt++) - { - if(it_flt->p_client == client) //the client is already in the flt info list - { - IPACMDBG_H("The client is found in flt info list.\n"); - it_flt->flt_rule_hdl[iptype] = flt_rule_hdl; - break; - } - } - - if(it_flt == peer->flt_rule.end()) //the client is not in the flt info list - { - IPACMDBG_H("The client is not found in flt info list, insert a new one.\n"); - memset(&new_flt_info, 0, sizeof(new_flt_info)); - new_flt_info.p_client = client; - new_flt_info.flt_rule_hdl[iptype] = flt_rule_hdl; - - peer->flt_rule.push_front(new_flt_info); - } - - return; -} - -void IPACM_LanToLan_Iface::del_one_client_flt_rule(IPACM_LanToLan_Iface *peer_iface, client_info *client) -{ - list<peer_iface_info>::iterator it; - - for(it = m_peer_iface_info.begin(); it != m_peer_iface_info.end(); it++) - { - if(it->peer == peer_iface) - { - IPACMDBG_H("Found the peer iface info.\n"); - del_client_flt_rule(&(*it), client); - break; - } - } - return; -} - -void IPACM_LanToLan_Iface::del_client_flt_rule(peer_iface_info *peer, client_info *client) -{ - list<flt_rule_info>::iterator it_flt; - - for(it_flt = peer->flt_rule.begin(); it_flt != peer->flt_rule.end(); it_flt++) - { - if(it_flt->p_client == client) //found the client in flt info list - { - IPACMDBG_H("Found the client in flt info list.\n"); - if(m_is_ip_addr_assigned[IPA_IP_v4]) - { - m_p_iface->eth_bridge_del_flt_rule(it_flt->flt_rule_hdl[IPA_IP_v4], IPA_IP_v4); - IPACMDBG_H("IPv4 flt rule %d is deleted.\n", it_flt->flt_rule_hdl[IPA_IP_v4]); - } - if(m_is_ip_addr_assigned[IPA_IP_v6]) - { - m_p_iface->eth_bridge_del_flt_rule(it_flt->flt_rule_hdl[IPA_IP_v6], IPA_IP_v6); - IPACMDBG_H("IPv6 flt rule %d is deleted.\n", it_flt->flt_rule_hdl[IPA_IP_v6]); - } - - peer->flt_rule.erase(it_flt); - break; - } - } - return; -} - -void IPACM_LanToLan_Iface::del_client_rt_rule(peer_iface_info *peer, client_info *client) -{ - ipa_hdr_l2_type peer_l2_hdr_type; - int i, num_rules; - - peer_l2_hdr_type = peer->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type; - /* if the peer info is not for intra interface communication */ - if(peer->peer != this) - { - IPACMDBG_H("Delete routing rules for inter interface communication.\n"); - - num_rules = client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4]; - for(i = 0; i < num_rules; i++) - { - m_p_iface->eth_bridge_del_rt_rule(client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i], IPA_IP_v4); - IPACMDBG_H("IPv4 rt rule %d is deleted.\n", client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i]); - } - client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4] = 0; - - num_rules = client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6]; - for(i = 0; i < num_rules; i++) - { - m_p_iface->eth_bridge_del_rt_rule(client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i], IPA_IP_v6); - IPACMDBG_H("IPv6 rt rule %d is deleted.\n", client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i]); - } - client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6] = 0; - } - else - { - IPACMDBG_H("Delete routing rules for intra interface communication.\n"); - num_rules = client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]; - for(i = 0; i < num_rules; i++) - { - m_p_iface->eth_bridge_del_rt_rule(client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i], IPA_IP_v4); - IPACMDBG_H("IPv4 rt rule %d is deleted.\n", client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i]); - } - client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4] = 0; - - num_rules = client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]; - for(i = 0; i < num_rules; i++) - { - m_p_iface->eth_bridge_del_rt_rule(client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i], IPA_IP_v6); - IPACMDBG_H("IPv6 rt rule %d is deleted.\n", client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i]); - } - client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6] = 0; - } - - return; -} - -void IPACM_LanToLan_Iface::handle_down_event() -{ - list<IPACM_LanToLan_Iface>::iterator it_other_iface; - list<peer_iface_info>::iterator it_own_peer_info, it_other_iface_peer_info; - IPACM_LanToLan_Iface *other_iface; - - /* clear inter-interface rules */ - if(m_support_inter_iface_offload) - { - for(it_own_peer_info = m_peer_iface_info.begin(); it_own_peer_info != m_peer_iface_info.end(); - it_own_peer_info++) - { - /* decrement reference count of peer l2 header type on both interfaces*/ - decrement_ref_cnt_peer_l2_hdr_type(it_own_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type); - it_own_peer_info->peer->decrement_ref_cnt_peer_l2_hdr_type(m_p_iface->tx_prop->tx[0].hdr_l2_type); - - /* first clear all flt rule on target interface */ - IPACMDBG_H("Clear all flt rule on target interface.\n"); - clear_all_flt_rule_for_one_peer_iface(&(*it_own_peer_info)); - - other_iface = it_own_peer_info->peer; - /* then clear all flt/rt rule and hdr proc ctx for target interface on peer interfaces */ - IPACMDBG_H("Clear all flt/rt rules and hdr proc ctx for target interface on peer interfaces %s.\n", - it_own_peer_info->peer->get_iface_pointer()->dev_name); - for(it_other_iface_peer_info = other_iface->m_peer_iface_info.begin(); - it_other_iface_peer_info != other_iface->m_peer_iface_info.end(); - it_other_iface_peer_info++) - { - if(it_other_iface_peer_info->peer == this) //found myself in other iface's peer info list - { - IPACMDBG_H("Found the right peer info on other iface.\n"); - other_iface->clear_all_flt_rule_for_one_peer_iface(&(*it_other_iface_peer_info)); - other_iface->clear_all_rt_rule_for_one_peer_iface(&(*it_other_iface_peer_info)); - /* remove the peer info from the list */ - other_iface->m_peer_iface_info.erase(it_other_iface_peer_info); - other_iface->del_hdr_proc_ctx(m_p_iface->tx_prop->tx[0].hdr_l2_type); - break; - } - } - - /* then clear rt rule and hdr proc ctx and release rt table on target interface */ - IPACMDBG_H("Clear rt rules and hdr proc ctx and release rt table on target interface.\n"); - clear_all_rt_rule_for_one_peer_iface(&(*it_own_peer_info)); - del_hdr_proc_ctx(it_own_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type); - } - m_peer_iface_info.clear(); - } - - /* clear intra interface rules */ - if(m_support_intra_iface_offload) - { - IPACMDBG_H("Clear intra interface flt/rt rules and hdr proc ctx, release rt tables.\n"); - clear_all_flt_rule_for_one_peer_iface(&m_intra_interface_info); - clear_all_rt_rule_for_one_peer_iface(&m_intra_interface_info); - m_p_iface->eth_bridge_del_hdr_proc_ctx(hdr_proc_ctx_for_intra_interface); - IPACMDBG_H("Hdr proc ctx with hdl %d is deleted.\n", hdr_proc_ctx_for_intra_interface); - } - - /* then clear the client info list */ - m_client_info.clear(); - - return; -} - -void IPACM_LanToLan_Iface::clear_all_flt_rule_for_one_peer_iface(peer_iface_info *peer) -{ - list<flt_rule_info>::iterator it; - - for(it = peer->flt_rule.begin(); it != peer->flt_rule.end(); it++) - { - if(m_is_ip_addr_assigned[IPA_IP_v4]) - { - m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v4], IPA_IP_v4); - IPACMDBG_H("IPv4 flt rule %d is deleted.\n", it->flt_rule_hdl[IPA_IP_v4]); - } - if(m_is_ip_addr_assigned[IPA_IP_v6]) - { - m_p_iface->eth_bridge_del_flt_rule(it->flt_rule_hdl[IPA_IP_v6], IPA_IP_v6); - IPACMDBG_H("IPv6 flt rule %d is deleted.\n", it->flt_rule_hdl[IPA_IP_v6]); - } - } - peer->flt_rule.clear(); - return; -} - -void IPACM_LanToLan_Iface::clear_all_rt_rule_for_one_peer_iface(peer_iface_info *peer) -{ - list<client_info>::iterator it; - ipa_hdr_l2_type peer_l2_type; - - peer_l2_type = peer->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type; - if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 0) - { - for(it = m_client_info.begin(); it != m_client_info.end(); it++) - { - del_client_rt_rule(peer, &(*it)); - } - } - - return; -} - -void IPACM_LanToLan_Iface::handle_wlan_scc_mcc_switch() -{ - list<peer_iface_info>::iterator it_peer_info; - list<client_info>::iterator it_client; - ipa_hdr_l2_type peer_l2_hdr_type; - bool flag[IPA_HDR_L2_MAX]; - int i; - - /* modify inter-interface routing rules */ - if(m_support_inter_iface_offload) - { - IPACMDBG_H("Modify rt rules for peer interfaces.\n"); - memset(flag, 0, sizeof(flag)); - for(it_peer_info = m_peer_iface_info.begin(); it_peer_info != m_peer_iface_info.end(); it_peer_info++) - { - peer_l2_hdr_type = it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type; - if(flag[peer_l2_hdr_type] == false) - { - flag[peer_l2_hdr_type] = true; - for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++) - { - m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type], - peer_l2_hdr_type, IPA_IP_v4, it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4], - it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4]); - IPACMDBG_H("The following IPv4 routing rules are modified:\n"); - for(i = 0; i < it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v4]; i++) - { - IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v4][i]); - } - - m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_inter_interface[peer_l2_hdr_type], - peer_l2_hdr_type, IPA_IP_v6, it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6], - it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6]); - IPACMDBG_H("The following IPv6 routing rules are modified:\n"); - for(i = 0; i < it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].num_hdl[IPA_IP_v6]; i++) - { - IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[peer_l2_hdr_type].rule_hdl[IPA_IP_v6][i]); - } - } - } - } - } - - /* modify routing rules for intra-interface communication */ - IPACMDBG_H("Modify rt rules for intra-interface communication.\n"); - if(m_support_intra_iface_offload) - { - for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++) - { - m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_intra_interface, - m_p_iface->tx_prop->tx[0].hdr_l2_type, IPA_IP_v4, it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4], - it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]); - IPACMDBG_H("The following IPv4 routing rules are modified:\n"); - for(i = 0; i < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]; i++) - { - IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][i]); - } - - m_p_iface->eth_bridge_modify_rt_rule(it_client->mac_addr, hdr_proc_ctx_for_intra_interface, - m_p_iface->tx_prop->tx[0].hdr_l2_type, IPA_IP_v6, it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6], - it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]); - IPACMDBG_H("The following IPv6 routing rules are modified:\n"); - for(i = 0; i < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]; i++) - { - IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][i]); - } - } - } - - return; -} - -void IPACM_LanToLan_Iface::handle_intra_interface_info() -{ - uint32_t hdr_proc_ctx_hdl; - - if(m_p_iface->tx_prop == NULL) - { - IPACMERR("No tx prop.\n"); - return; - } - - m_intra_interface_info.peer = this; - - snprintf(m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX, - "eth_v4_intra_interface"); - IPACMDBG_H("IPv4 routing table for flt name: %s\n", m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v4]); - snprintf(m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX, - "eth_v6_intra_interface"); - IPACMDBG_H("IPv6 routing table for flt name: %s\n", m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v6]); - - memcpy(m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v4], m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v4], - IPA_RESOURCE_NAME_MAX); - IPACMDBG_H("IPv4 routing table for rt name: %s\n", m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v4]); - memcpy(m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v6], m_intra_interface_info.rt_tbl_name_for_flt[IPA_IP_v6], - IPA_RESOURCE_NAME_MAX); - IPACMDBG_H("IPv6 routing table for rt name: %s\n", m_intra_interface_info.rt_tbl_name_for_rt[IPA_IP_v6]); - - m_p_iface->eth_bridge_add_hdr_proc_ctx(m_p_iface->tx_prop->tx[0].hdr_l2_type, - &hdr_proc_ctx_hdl); - hdr_proc_ctx_for_intra_interface = hdr_proc_ctx_hdl; - IPACMDBG_H("Hdr proc ctx for intra-interface communication: hdl %d\n", hdr_proc_ctx_hdl); - - return; -} - -void IPACM_LanToLan_Iface::handle_new_iface_up(char rt_tbl_name_for_flt[][IPA_RESOURCE_NAME_MAX], char rt_tbl_name_for_rt[][IPA_RESOURCE_NAME_MAX], - IPACM_LanToLan_Iface *peer_iface) -{ - peer_iface_info new_peer; - ipa_hdr_l2_type peer_l2_hdr_type; - - new_peer.peer = peer_iface; - memcpy(new_peer.rt_tbl_name_for_rt[IPA_IP_v4], rt_tbl_name_for_rt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX); - memcpy(new_peer.rt_tbl_name_for_rt[IPA_IP_v6], rt_tbl_name_for_rt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX); - memcpy(new_peer.rt_tbl_name_for_flt[IPA_IP_v4], rt_tbl_name_for_flt[IPA_IP_v4], IPA_RESOURCE_NAME_MAX); - memcpy(new_peer.rt_tbl_name_for_flt[IPA_IP_v6], rt_tbl_name_for_flt[IPA_IP_v6], IPA_RESOURCE_NAME_MAX); - - peer_l2_hdr_type = peer_iface->m_p_iface->tx_prop->tx[0].hdr_l2_type; - increment_ref_cnt_peer_l2_hdr_type(peer_l2_hdr_type); - add_hdr_proc_ctx(peer_l2_hdr_type); - - /* push the new peer_iface_info into the list */ - m_peer_iface_info.push_front(new_peer); - - return; -} - -void IPACM_LanToLan_Iface::handle_client_add(uint8_t *mac) -{ - list<client_info>::iterator it_client; - list<peer_iface_info>::iterator it_peer_info; - client_info new_client; - bool flag[IPA_HDR_L2_MAX]; - - for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++) - { - if(memcmp(it_client->mac_addr, mac, sizeof(it_client->mac_addr)) == 0) - { - IPACMDBG_H("This client has been added before.\n"); - return; - } - } - - if(m_client_info.size() == MAX_NUM_CLIENT) - { - IPACMDBG_H("The number of clients has reached maximum %d.\n", MAX_NUM_CLIENT); - return; - } - - memcpy(new_client.mac_addr, mac, sizeof(new_client.mac_addr)); - m_client_info.push_front(new_client); - - client_info &front_client = m_client_info.front(); - - /* install inter-interface rules */ - if(m_support_inter_iface_offload) - { - memset(flag, 0, sizeof(flag)); - for(it_peer_info = m_peer_iface_info.begin(); it_peer_info != m_peer_iface_info.end(); it_peer_info++) - { - /* make sure add routing rule only once for each peer l2 header type */ - if(flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] == false) - { - /* add client routing rule for each peer interface */ - add_client_rt_rule(&(*it_peer_info), &front_client); - flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] = true; - } - - /* add client filtering rule on peer interfaces */ - it_peer_info->peer->add_one_client_flt_rule(this, &front_client); - } - } - - /* install intra-interface rules */ - if(m_support_intra_iface_offload) - { - /* add routing rule first */ - add_client_rt_rule(&m_intra_interface_info, &front_client); - - /* add filtering rule */ - if(m_is_ip_addr_assigned[IPA_IP_v4]) - { - add_client_flt_rule(&m_intra_interface_info, &front_client, IPA_IP_v4); - } - if(m_is_ip_addr_assigned[IPA_IP_v6]) - { - add_client_flt_rule(&m_intra_interface_info, &front_client, IPA_IP_v6); - } - } - - return; -} - -void IPACM_LanToLan_Iface::handle_client_del(uint8_t *mac) -{ - list<client_info>::iterator it_client; - list<peer_iface_info>::iterator it_peer_info; - bool flag[IPA_HDR_L2_MAX]; - - for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++) - { - if(memcmp(it_client->mac_addr, mac, sizeof(it_client->mac_addr)) == 0) //found the client - { - IPACMDBG_H("Found the client.\n"); - break; - } - } - - if(it_client != m_client_info.end()) //if we found the client - { - /* uninstall inter-interface rules */ - if(m_support_inter_iface_offload) - { - memset(flag, 0, sizeof(flag)); - for(it_peer_info = m_peer_iface_info.begin(); it_peer_info != m_peer_iface_info.end(); - it_peer_info++) - { - IPACMDBG_H("Delete client filtering rule on peer interface.\n"); - it_peer_info->peer->del_one_client_flt_rule(this, &(*it_client)); - - /* make sure to delete routing rule only once for each peer l2 header type */ - if(flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] == false) - { - IPACMDBG_H("Delete client routing rule for peer interface.\n"); - del_client_rt_rule(&(*it_peer_info), &(*it_client)); - flag[it_peer_info->peer->get_iface_pointer()->tx_prop->tx[0].hdr_l2_type] = true; - } - } - } - - /* uninstall intra-interface rules */ - if(m_support_intra_iface_offload) - { - /* delete filtering rule first */ - IPACMDBG_H("Delete client filtering rule for intra-interface communication.\n"); - del_client_flt_rule(&m_intra_interface_info, &(*it_client)); - - /* delete routing rule */ - IPACMDBG_H("Delete client routing rule for intra-interface communication.\n"); - del_client_rt_rule(&m_intra_interface_info, &(*it_client)); - } - - /* erase the client from client info list */ - m_client_info.erase(it_client); - } - else - { - IPACMDBG_H("The client is not found.\n"); - } - - return; -} - -void IPACM_LanToLan_Iface::add_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type) -{ - uint32_t hdr_proc_ctx_hdl; - - if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 1) - { - m_p_iface->eth_bridge_add_hdr_proc_ctx(peer_l2_type, &hdr_proc_ctx_hdl); - hdr_proc_ctx_for_inter_interface[peer_l2_type] = hdr_proc_ctx_hdl; - IPACMDBG_H("Installed inter-interface hdr proc ctx on iface %s: handle %d\n", m_p_iface->dev_name, hdr_proc_ctx_hdl); - } - return; -} - -void IPACM_LanToLan_Iface::del_hdr_proc_ctx(ipa_hdr_l2_type peer_l2_type) -{ - if(ref_cnt_peer_l2_hdr_type[peer_l2_type] == 0) - { - m_p_iface->eth_bridge_del_hdr_proc_ctx(hdr_proc_ctx_for_inter_interface[peer_l2_type]); - IPACMDBG_H("Hdr proc ctx with hdl %d is deleted.\n", hdr_proc_ctx_for_inter_interface[peer_l2_type]); - } - return; -} - -void IPACM_LanToLan_Iface::print_data_structure_info() -{ - list<peer_iface_info>::iterator it_peer; - list<client_info>::iterator it_client; - int i, j, k; - - IPACMDBG_H("\n"); - IPACMDBG_H("Interface %s:\n", m_p_iface->dev_name); - IPACMDBG_H("Is IPv4 addr assigned? %d\n", m_is_ip_addr_assigned[IPA_IP_v4]); - IPACMDBG_H("Is IPv6 addr assigned? %d\n", m_is_ip_addr_assigned[IPA_IP_v6]); - IPACMDBG_H("Support inter interface offload? %d\n", m_support_inter_iface_offload); - IPACMDBG_H("Support intra interface offload? %d\n", m_support_intra_iface_offload); - - if(m_support_inter_iface_offload) - { - for(i = 0; i < IPA_HDR_L2_MAX; i++) - { - IPACMDBG_H("Ref_cnt of peer l2 type %s is %d.\n", ipa_l2_hdr_type[i], ref_cnt_peer_l2_hdr_type[i]); - if(ref_cnt_peer_l2_hdr_type[i] > 0) - { - IPACMDBG_H("Hdr proc ctx for peer l2 type %s: %d\n", ipa_l2_hdr_type[i], hdr_proc_ctx_for_inter_interface[i]); - } - } - } - - if(m_support_intra_iface_offload) - { - IPACMDBG_H("Hdr proc ctx for intra-interface: %d\n", hdr_proc_ctx_for_intra_interface); - } - - i = 1; - IPACMDBG_H("There are %d clients in total.\n", m_client_info.size()); - for(it_client = m_client_info.begin(); it_client != m_client_info.end(); it_client++) - { - IPACMDBG_H("Client %d MAC: 0x%02x%02x%02x%02x%02x%02x Pointer: 0x%08x\n", i, it_client->mac_addr[0], it_client->mac_addr[1], - it_client->mac_addr[2], it_client->mac_addr[3], it_client->mac_addr[4], it_client->mac_addr[5], &(*it_client)); - - if(m_support_inter_iface_offload) - { - for(j = 0; j < IPA_HDR_L2_MAX; j++) - { - if(ref_cnt_peer_l2_hdr_type[j] > 0) - { - IPACMDBG_H("Printing routing rule info for inter-interface communication for peer l2 type %s.\n", - ipa_l2_hdr_type[j]); - IPACMDBG_H("Number of IPv4 routing rules is %d, handles:\n", it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v4]); - for(k = 0; k < it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v4]; k++) - { - IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[j].rule_hdl[IPA_IP_v4][k]); - } - - IPACMDBG_H("Number of IPv6 routing rules is %d, handles:\n", it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v6]); - for(k = 0; k < it_client->inter_iface_rt_rule_hdl[j].num_hdl[IPA_IP_v6]; k++) - { - IPACMDBG_H("%d\n", it_client->inter_iface_rt_rule_hdl[j].rule_hdl[IPA_IP_v6][k]); - } - } - } - } - - if(m_support_intra_iface_offload) - { - IPACMDBG_H("Printing routing rule info for intra-interface communication.\n"); - IPACMDBG_H("Number of IPv4 routing rules is %d, handles:\n", it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]); - for(j = 0; j < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v4]; j++) - { - IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v4][j]); - } - - IPACMDBG_H("Number of IPv6 routing rules is %d, handles:\n", it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]); - for(j = 0; j < it_client->intra_iface_rt_rule_hdl.num_hdl[IPA_IP_v6]; j++) - { - IPACMDBG_H("%d\n", it_client->intra_iface_rt_rule_hdl.rule_hdl[IPA_IP_v6][j]); - } - } - i++; - } - - IPACMDBG_H("There are %d peer interfaces in total.\n", m_peer_iface_info.size()); - for(it_peer = m_peer_iface_info.begin(); it_peer != m_peer_iface_info.end(); it_peer++) - { - print_peer_info(&(*it_peer)); - } - - if(m_support_intra_iface_offload) - { - IPACMDBG_H("This interface supports intra-interface communication, printing info:\n"); - print_peer_info(&m_intra_interface_info); - } - - return; -} - -void IPACM_LanToLan_Iface::print_peer_info(peer_iface_info *peer_info) -{ - list<flt_rule_info>::iterator it_flt; - list<rt_rule_info>::iterator it_rt; - - IPACMDBG_H("Printing peer info for iface %s:\n", peer_info->peer->m_p_iface->dev_name); - - IPACMDBG_H("There are %d flt info in total.\n", peer_info->flt_rule.size()); - for(it_flt = peer_info->flt_rule.begin(); it_flt != peer_info->flt_rule.end(); it_flt++) - { - IPACMDBG_H("Flt rule handle for client 0x%08x:\n", it_flt->p_client); - if(m_is_ip_addr_assigned[IPA_IP_v4]) - { - IPACMDBG_H("IPv4 %d\n", it_flt->flt_rule_hdl[IPA_IP_v4]); - } - if(m_is_ip_addr_assigned[IPA_IP_v6]) - { - IPACMDBG_H("IPv6 %d\n", it_flt->flt_rule_hdl[IPA_IP_v6]); - } - } - - return; -} - -IPACM_Lan* IPACM_LanToLan_Iface::get_iface_pointer() -{ - return m_p_iface; -} - -bool IPACM_LanToLan_Iface::get_m_is_ip_addr_assigned(ipa_ip_type iptype) -{ - IPACMDBG_H("Has IP address been assigned to interface %s for IP type %d? %d\n", - m_p_iface->dev_name, iptype, m_is_ip_addr_assigned[iptype]); - return m_is_ip_addr_assigned[iptype]; -} - -void IPACM_LanToLan_Iface::set_m_is_ip_addr_assigned(ipa_ip_type iptype, bool value) -{ - IPACMDBG_H("Is IP address of IP type %d assigned to interface %s? %d\n", iptype, - m_p_iface->dev_name, value); - m_is_ip_addr_assigned[iptype] = value; -} - -bool IPACM_LanToLan_Iface::get_m_support_inter_iface_offload() -{ - IPACMDBG_H("Support inter interface offload on %s? %d\n", m_p_iface->dev_name, - m_support_inter_iface_offload); - return m_support_inter_iface_offload; -} - -bool IPACM_LanToLan_Iface::get_m_support_intra_iface_offload() -{ - IPACMDBG_H("Support intra interface offload on %s? %d\n", m_p_iface->dev_name, - m_support_intra_iface_offload); - return m_support_intra_iface_offload; -} - -void IPACM_LanToLan_Iface::increment_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type) -{ - ref_cnt_peer_l2_hdr_type[peer_l2_type]++; - IPACMDBG_H("Now the ref_cnt of peer l2 hdr type %s is %d.\n", ipa_l2_hdr_type[peer_l2_type], - ref_cnt_peer_l2_hdr_type[peer_l2_type]); - - return; -} - -void IPACM_LanToLan_Iface::decrement_ref_cnt_peer_l2_hdr_type(ipa_hdr_l2_type peer_l2_type) -{ - ref_cnt_peer_l2_hdr_type[peer_l2_type]--; - IPACMDBG_H("Now the ref_cnt of peer l2 hdr type %s is %d.\n", ipa_l2_hdr_type[peer_l2_type], - ref_cnt_peer_l2_hdr_type[peer_l2_type]); - - return; -} diff --git a/ipacm/src/IPACM_Log.cpp b/ipacm/src/IPACM_Log.cpp deleted file mode 100644 index 20dd26c..0000000 --- a/ipacm/src/IPACM_Log.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_log.cpp - - @brief - This file implements the IPAM log functionality. - - @Author - Skylar Chang - -*/ -#include "IPACM_Log.h" -#include <stdlib.h> -#include <unistd.h> -#include <sys/socket.h> -#include <sys/types.h> -#include <fcntl.h> -#include <unistd.h> -#include <asm/types.h> -#include <linux/if.h> -#include <sys/un.h> -#include <errno.h> -#include <IPACM_Defs.h> - -void logmessage(int log_level) -{ - return; -} - -/* start IPACMDIAG socket*/ -int create_socket(unsigned int *sockfd) -{ - - if ((*sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == IPACM_FAILURE) - { - perror("Error creating ipacm_log socket\n"); - return IPACM_FAILURE; - } - - if(fcntl(*sockfd, F_SETFD, FD_CLOEXEC) < 0) - { - perror("Couldn't set ipacm_log Close on Exec\n"); - } - - return IPACM_SUCCESS; -} - -void ipacm_log_send( void * user_data) -{ - ipacm_log_buffer_t ipacm_log_buffer; - int numBytes=0, len; - struct sockaddr_un ipacmlog_socket; - static unsigned int ipacm_log_sockfd = 0; - - if(ipacm_log_sockfd == 0) - { - /* start ipacm_log socket */ - if(create_socket(&ipacm_log_sockfd) < 0) - { - printf("unable to create ipacm_log socket\n"); - return; - } - printf("create ipacm_log socket successfully\n"); - } - ipacmlog_socket.sun_family = AF_UNIX; - strcpy(ipacmlog_socket.sun_path, IPACMLOG_FILE); - len = strlen(ipacmlog_socket.sun_path) + sizeof(ipacmlog_socket.sun_family); - - memcpy(ipacm_log_buffer.user_data, user_data, MAX_BUF_LEN); - - //printf("send : %s\n", ipacm_log_buffer.user_data); - if ((numBytes = sendto(ipacm_log_sockfd, (void *)&ipacm_log_buffer, sizeof(ipacm_log_buffer.user_data), 0, - (struct sockaddr *)&ipacmlog_socket, len)) == -1) - { - printf("Send Failed(%d) %s \n",errno,strerror(errno)); - return; - } - return; -} diff --git a/ipacm/src/IPACM_Main.cpp b/ipacm/src/IPACM_Main.cpp deleted file mode 100644 index c6ab9ee..0000000 --- a/ipacm/src/IPACM_Main.cpp +++ /dev/null @@ -1,939 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Main.cpp - - @brief - This file implements the IPAM functionality. - - @Author - Skylar Chang - -*/ -/****************************************************************************** - - IPCM_MAIN.C - -******************************************************************************/ - -#include <sys/socket.h> -#include <signal.h> -#include <fcntl.h> -#include <pthread.h> -#include <sys/ioctl.h> -#include <linux/if.h> -#include <linux/netlink.h> -#include <linux/rtnetlink.h> -#include <fcntl.h> -#include <sys/inotify.h> -#include <stdlib.h> -#include <signal.h> -#include "linux/ipa_qmi_service_v01.h" - -#include "IPACM_CmdQueue.h" -#include "IPACM_EvtDispatcher.h" -#include "IPACM_Defs.h" -#include "IPACM_Neighbor.h" -#include "IPACM_IfaceManager.h" -#include "IPACM_Log.h" - -#include "IPACM_ConntrackListener.h" -#include "IPACM_ConntrackClient.h" -#include "IPACM_Netlink.h" - -/* not defined(FEATURE_IPA_ANDROID)*/ -#ifndef FEATURE_IPA_ANDROID -#include "IPACM_LanToLan.h" -#endif - -#define IPA_DRIVER "/dev/ipa" - -#define IPACM_FIREWALL_FILE_NAME "mobileap_firewall.xml" -#define IPACM_CFG_FILE_NAME "IPACM_cfg.xml" -#ifdef FEATURE_IPA_ANDROID -#define IPACM_PID_FILE "/data/misc/ipa/ipacm.pid" -#define IPACM_DIR_NAME "/data" -#else/* defined(FEATURE_IPA_ANDROID) */ -#define IPACM_PID_FILE "/etc/ipacm.pid" -#define IPACM_DIR_NAME "/etc" -#endif /* defined(NOT FEATURE_IPA_ANDROID)*/ -#define IPACM_NAME "ipacm" - -#define INOTIFY_EVENT_SIZE (sizeof(struct inotify_event)) -#define INOTIFY_BUF_LEN (INOTIFY_EVENT_SIZE + 2*sizeof(IPACM_FIREWALL_FILE_NAME)) - -#define IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS 3 -#define IPA_DRIVER_WLAN_EVENT_SIZE (sizeof(struct ipa_wlan_msg_ex)+ IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS*sizeof(ipa_wlan_hdr_attrib_val)) -#define IPA_DRIVER_PIPE_STATS_EVENT_SIZE (sizeof(struct ipa_get_data_stats_resp_msg_v01)) -#define IPA_DRIVER_WLAN_META_MSG (sizeof(struct ipa_msg_meta)) -#define IPA_DRIVER_WLAN_BUF_LEN (IPA_DRIVER_PIPE_STATS_EVENT_SIZE + IPA_DRIVER_WLAN_META_MSG) - -uint32_t ipacm_event_stats[IPACM_EVENT_MAX]; -bool ipacm_logging = true; - -void ipa_is_ipacm_running(void); -int ipa_get_if_index(char *if_name, int *if_index); - -/* start netlink socket monitor*/ -void* netlink_start(void *param) -{ - ipa_nl_sk_fd_set_info_t sk_fdset; - int ret_val = 0; - memset(&sk_fdset, 0, sizeof(ipa_nl_sk_fd_set_info_t)); - IPACMDBG_H("netlink starter memset sk_fdset succeeds\n"); - ret_val = ipa_nl_listener_init(NETLINK_ROUTE, (RTMGRP_IPV4_ROUTE | RTMGRP_IPV6_ROUTE | RTMGRP_LINK | - RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR | RTMGRP_NEIGH | - RTNLGRP_IPV6_PREFIX), - &sk_fdset, ipa_nl_recv_msg); - - if (ret_val != IPACM_SUCCESS) - { - IPACMERR("Failed to initialize IPA netlink event listener\n"); - return NULL; - } - - return NULL; -} - -/* start firewall-rule monitor*/ -void* firewall_monitor(void *param) -{ - int length; - int wd; - char buffer[INOTIFY_BUF_LEN]; - int inotify_fd; - ipacm_cmd_q_data evt_data; - uint32_t mask = IN_MODIFY | IN_MOVE; - - inotify_fd = inotify_init(); - if (inotify_fd < 0) - { - PERROR("inotify_init"); - } - - IPACMDBG_H("Waiting for nofications in dir %s with mask: 0x%x\n", IPACM_DIR_NAME, mask); - - wd = inotify_add_watch(inotify_fd, - IPACM_DIR_NAME, - mask); - - while (1) - { - length = read(inotify_fd, buffer, INOTIFY_BUF_LEN); - if (length < 0) - { - IPACMERR("inotify read() error return length: %d and mask: 0x%x\n", length, mask); - continue; - } - - struct inotify_event* event; - event = (struct inotify_event*)malloc(length); - if(event == NULL) - { - IPACMERR("Failed to allocate memory.\n"); - return NULL; - } - memset(event, 0, length); - memcpy(event, buffer, length); - - if (event->len > 0) - { - if ( (event->mask & IN_MODIFY) || (event->mask & IN_MOVE)) - { - if (event->mask & IN_ISDIR) - { - IPACMDBG_H("The directory %s was 0x%x\n", event->name, event->mask); - } - else if (!strncmp(event->name, IPACM_FIREWALL_FILE_NAME, event->len)) // firewall_rule change - { - IPACMDBG_H("File \"%s\" was 0x%x\n", event->name, event->mask); - IPACMDBG_H("The interested file %s .\n", IPACM_FIREWALL_FILE_NAME); - - evt_data.event = IPA_FIREWALL_CHANGE_EVENT; - evt_data.evt_data = NULL; - - /* Insert IPA_FIREWALL_CHANGE_EVENT to command queue */ - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - else if (!strncmp(event->name, IPACM_CFG_FILE_NAME, event->len)) // IPACM_configuration change - { - IPACMDBG_H("File \"%s\" was 0x%x\n", event->name, event->mask); - IPACMDBG_H("The interested file %s .\n", IPACM_CFG_FILE_NAME); - - evt_data.event = IPA_CFG_CHANGE_EVENT; - evt_data.evt_data = NULL; - - /* Insert IPA_FIREWALL_CHANGE_EVENT to command queue */ - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - } - IPACMDBG_H("Received monitoring event %s.\n", event->name); - } - free(event); - } - - (void)inotify_rm_watch(inotify_fd, wd); - (void)close(inotify_fd); - return NULL; -} - - -/* start IPACM wan-driver notifier */ -void* ipa_driver_msg_notifier(void *param) -{ - int length, fd, cnt; - char buffer[IPA_DRIVER_WLAN_BUF_LEN]; - struct ipa_msg_meta event_hdr; - struct ipa_ecm_msg event_ecm; - struct ipa_wan_msg event_wan; - struct ipa_wlan_msg_ex event_ex_o; - struct ipa_wlan_msg *event_wlan=NULL; - struct ipa_wlan_msg_ex *event_ex= NULL; - struct ipa_get_data_stats_resp_msg_v01 event_data_stats; - struct ipa_get_apn_data_stats_resp_msg_v01 event_network_stats; - - ipacm_cmd_q_data evt_data; - ipacm_event_data_mac *data = NULL; - ipacm_event_data_fid *data_fid = NULL; - ipacm_event_data_iptype *data_iptype = NULL; - ipacm_event_data_wlan_ex *data_ex; - ipa_get_data_stats_resp_msg_v01 *data_tethering_stats = NULL; - ipa_get_apn_data_stats_resp_msg_v01 *data_network_stats = NULL; - - ipacm_cmd_q_data new_neigh_evt; - ipacm_event_data_all* new_neigh_data; - - fd = open(IPA_DRIVER, O_RDWR); - if (fd < 0) - { - IPACMERR("Failed opening %s.\n", IPA_DRIVER); - return NULL; - } - - while (1) - { - IPACMDBG_H("Waiting for nofications from IPA driver \n"); - memset(buffer, 0, sizeof(buffer)); - memset(&evt_data, 0, sizeof(evt_data)); - memset(&new_neigh_evt, 0, sizeof(ipacm_cmd_q_data)); - new_neigh_data = NULL; - data = NULL; - data_fid = NULL; - data_tethering_stats = NULL; - data_network_stats = NULL; - - length = read(fd, buffer, IPA_DRIVER_WLAN_BUF_LEN); - if (length < 0) - { - PERROR("didn't read IPA_driver correctly"); - continue; - } - - memcpy(&event_hdr, buffer,sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Message type: %d\n", event_hdr.msg_type); - IPACMDBG_H("Event header length received: %d\n",event_hdr.msg_len); - - /* Insert WLAN_DRIVER_EVENT to command queue */ - switch (event_hdr.msg_type) - { - - case SW_ROUTING_ENABLE: - IPACMDBG_H("Received SW_ROUTING_ENABLE\n"); - evt_data.event = IPA_SW_ROUTING_ENABLE; - IPACMDBG_H("Not supported anymore\n"); - continue; - - case SW_ROUTING_DISABLE: - IPACMDBG_H("Received SW_ROUTING_DISABLE\n"); - evt_data.event = IPA_SW_ROUTING_DISABLE; - IPACMDBG_H("Not supported anymore\n"); - continue; - - case WLAN_AP_CONNECT: - event_wlan = (struct ipa_wlan_msg *) (buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Received WLAN_AP_CONNECT name: %s\n",event_wlan->name); - IPACMDBG_H("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data_fid\n"); - return NULL; - } - ipa_get_if_index(event_wlan->name, &(data_fid->if_index)); - evt_data.event = IPA_WLAN_AP_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - break; - - case WLAN_AP_DISCONNECT: - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Received WLAN_AP_DISCONNECT name: %s\n",event_wlan->name); - IPACMDBG_H("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data_fid\n"); - return NULL; - } - ipa_get_if_index(event_wlan->name, &(data_fid->if_index)); - evt_data.event = IPA_WLAN_LINK_DOWN_EVENT; - evt_data.evt_data = data_fid; - break; - case WLAN_STA_CONNECT: - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Received WLAN_STA_CONNECT name: %s\n",event_wlan->name); - IPACMDBG_H("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); - if(data == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data_fid\n"); - return NULL; - } - memcpy(data->mac_addr, - event_wlan->mac_addr, - sizeof(event_wlan->mac_addr)); - ipa_get_if_index(event_wlan->name, &(data->if_index)); - evt_data.event = IPA_WLAN_STA_LINK_UP_EVENT; - evt_data.evt_data = data; - break; - - case WLAN_STA_DISCONNECT: - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Received WLAN_STA_DISCONNECT name: %s\n",event_wlan->name); - IPACMDBG_H("STA Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data_fid\n"); - return NULL; - } - ipa_get_if_index(event_wlan->name, &(data_fid->if_index)); - evt_data.event = IPA_WLAN_LINK_DOWN_EVENT; - evt_data.evt_data = data_fid; - break; - - case WLAN_CLIENT_CONNECT: - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Received WLAN_CLIENT_CONNECT\n"); - IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); - if (data == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data\n"); - return NULL; - } - memcpy(data->mac_addr, - event_wlan->mac_addr, - sizeof(event_wlan->mac_addr)); - ipa_get_if_index(event_wlan->name, &(data->if_index)); - evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT; - evt_data.evt_data = data; - break; - - case WLAN_CLIENT_CONNECT_EX: - IPACMDBG_H("Received WLAN_CLIENT_CONNECT_EX\n"); - - memcpy(&event_ex_o, buffer + sizeof(struct ipa_msg_meta),sizeof(struct ipa_wlan_msg_ex)); - if(event_ex_o.num_of_attribs > IPA_DRIVER_WLAN_EVENT_MAX_OF_ATTRIBS) - { - IPACMERR("buffer size overflow\n"); - return NULL; - } - length = sizeof(ipa_wlan_msg_ex)+ event_ex_o.num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val); - IPACMDBG_H("num_of_attribs %d, length %d\n", event_ex_o.num_of_attribs, length); - event_ex = (ipa_wlan_msg_ex *)malloc(length); - if(event_ex == NULL ) - { - IPACMERR("Unable to allocate memory\n"); - return NULL; - } - memcpy(event_ex, buffer + sizeof(struct ipa_msg_meta), length); - data_ex = (ipacm_event_data_wlan_ex *)malloc(sizeof(ipacm_event_data_wlan_ex) + event_ex_o.num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val)); - if (data_ex == NULL) - { - IPACMERR("unable to allocate memory for event data\n"); - return NULL; - } - data_ex->num_of_attribs = event_ex->num_of_attribs; - - memcpy(data_ex->attribs, - event_ex->attribs, - event_ex->num_of_attribs * sizeof(ipa_wlan_hdr_attrib_val)); - - ipa_get_if_index(event_ex->name, &(data_ex->if_index)); - evt_data.event = IPA_WLAN_CLIENT_ADD_EVENT_EX; - evt_data.evt_data = data_ex; - - /* Construct new_neighbor msg with netdev device internally */ - new_neigh_data = (ipacm_event_data_all*)malloc(sizeof(ipacm_event_data_all)); - if(new_neigh_data == NULL) - { - IPACMERR("Failed to allocate memory.\n"); - return NULL; - } - memset(new_neigh_data, 0, sizeof(ipacm_event_data_all)); - new_neigh_data->iptype = IPA_IP_v6; - for(cnt = 0; cnt < event_ex->num_of_attribs; cnt++) - { - if(event_ex->attribs[cnt].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR) - { - memcpy(new_neigh_data->mac_addr, event_ex->attribs[cnt].u.mac_addr, sizeof(new_neigh_data->mac_addr)); - IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_ex->attribs[cnt].u.mac_addr[0], event_ex->attribs[cnt].u.mac_addr[1], event_ex->attribs[cnt].u.mac_addr[2], - event_ex->attribs[cnt].u.mac_addr[3], event_ex->attribs[cnt].u.mac_addr[4], event_ex->attribs[cnt].u.mac_addr[5]); - } - else if(event_ex->attribs[cnt].attrib_type == WLAN_HDR_ATTRIB_STA_ID) - { - IPACMDBG_H("Wlan client id %d\n",event_ex->attribs[cnt].u.sta_id); - } - else - { - IPACMDBG_H("Wlan message has unexpected type!\n"); - } - } - new_neigh_data->if_index = data_ex->if_index; - new_neigh_evt.evt_data = (void*)new_neigh_data; - new_neigh_evt.event = IPA_NEW_NEIGH_EVENT; - free(event_ex); - break; - - case WLAN_CLIENT_DISCONNECT: - IPACMDBG_H("Received WLAN_CLIENT_DISCONNECT\n"); - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); - if (data == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data\n"); - return NULL; - } - memcpy(data->mac_addr, - event_wlan->mac_addr, - sizeof(event_wlan->mac_addr)); - ipa_get_if_index(event_wlan->name, &(data->if_index)); - evt_data.event = IPA_WLAN_CLIENT_DEL_EVENT; - evt_data.evt_data = data; - break; - - case WLAN_CLIENT_POWER_SAVE_MODE: - IPACMDBG_H("Received WLAN_CLIENT_POWER_SAVE_MODE\n"); - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); - if (data == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data\n"); - return NULL; - } - memcpy(data->mac_addr, - event_wlan->mac_addr, - sizeof(event_wlan->mac_addr)); - ipa_get_if_index(event_wlan->name, &(data->if_index)); - evt_data.event = IPA_WLAN_CLIENT_POWER_SAVE_EVENT; - evt_data.evt_data = data; - break; - - case WLAN_CLIENT_NORMAL_MODE: - IPACMDBG_H("Received WLAN_CLIENT_NORMAL_MODE\n"); - event_wlan = (struct ipa_wlan_msg *)(buffer + sizeof(struct ipa_msg_meta)); - IPACMDBG_H("Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - event_wlan->mac_addr[0], event_wlan->mac_addr[1], event_wlan->mac_addr[2], - event_wlan->mac_addr[3], event_wlan->mac_addr[4], event_wlan->mac_addr[5]); - data = (ipacm_event_data_mac *)malloc(sizeof(ipacm_event_data_mac)); - if (data == NULL) - { - IPACMERR("unable to allocate memory for event_wlan data\n"); - return NULL; - } - memcpy(data->mac_addr, - event_wlan->mac_addr, - sizeof(event_wlan->mac_addr)); - ipa_get_if_index(event_wlan->name, &(data->if_index)); - evt_data.evt_data = data; - evt_data.event = IPA_WLAN_CLIENT_RECOVER_EVENT; - break; - - case ECM_CONNECT: - memcpy(&event_ecm, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_ecm_msg)); - IPACMDBG_H("Received ECM_CONNECT name: %s\n",event_ecm.name); - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event_ecm data_fid\n"); - return NULL; - } - data_fid->if_index = event_ecm.ifindex; - evt_data.event = IPA_USB_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - break; - - case ECM_DISCONNECT: - memcpy(&event_ecm, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_ecm_msg)); - IPACMDBG_H("Received ECM_DISCONNECT name: %s\n",event_ecm.name); - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event_ecm data_fid\n"); - return NULL; - } - data_fid->if_index = event_ecm.ifindex; - evt_data.event = IPA_LINK_DOWN_EVENT; - evt_data.evt_data = data_fid; - break; - /* Add for 8994 Android case */ - case WAN_UPSTREAM_ROUTE_ADD: - memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_wan_msg)); - IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_ADD name: %s, tethered name: %s\n", event_wan.upstream_ifname, event_wan.tethered_ifname); - data_iptype = (ipacm_event_data_iptype *)malloc(sizeof(ipacm_event_data_iptype)); - if(data_iptype == NULL) - { - IPACMERR("unable to allocate memory for event_ecm data_iptype\n"); - return NULL; - } - ipa_get_if_index(event_wan.upstream_ifname, &(data_iptype->if_index)); - ipa_get_if_index(event_wan.tethered_ifname, &(data_iptype->if_index_tether)); - data_iptype->iptype = event_wan.ip; -#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN - data_iptype->ipv4_addr_gw = event_wan.ipv4_addr_gw; - data_iptype->ipv6_addr_gw[0] = event_wan.ipv6_addr_gw[0]; - data_iptype->ipv6_addr_gw[1] = event_wan.ipv6_addr_gw[1]; - data_iptype->ipv6_addr_gw[2] = event_wan.ipv6_addr_gw[2]; - data_iptype->ipv6_addr_gw[3] = event_wan.ipv6_addr_gw[3]; - IPACMDBG_H("default gw ipv4 (%x)\n", data_iptype->ipv4_addr_gw); - IPACMDBG_H("IPV6 gateway: %08x:%08x:%08x:%08x \n", - data_iptype->ipv6_addr_gw[0], data_iptype->ipv6_addr_gw[1], data_iptype->ipv6_addr_gw[2], data_iptype->ipv6_addr_gw[3]); -#endif - IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_ADD: fid(%d) tether_fid(%d) ip-type(%d)\n", data_iptype->if_index, - data_iptype->if_index_tether, data_iptype->iptype); - evt_data.event = IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT; - evt_data.evt_data = data_iptype; - break; - case WAN_UPSTREAM_ROUTE_DEL: - memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_wan_msg)); - IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL name: %s, tethered name: %s\n", event_wan.upstream_ifname, event_wan.tethered_ifname); - data_iptype = (ipacm_event_data_iptype *)malloc(sizeof(ipacm_event_data_iptype)); - if(data_iptype == NULL) - { - IPACMERR("unable to allocate memory for event_ecm data_iptype\n"); - return NULL; - } - ipa_get_if_index(event_wan.upstream_ifname, &(data_iptype->if_index)); - ipa_get_if_index(event_wan.tethered_ifname, &(data_iptype->if_index_tether)); - data_iptype->iptype = event_wan.ip; - IPACMDBG_H("Received WAN_UPSTREAM_ROUTE_DEL: fid(%d) ip-type(%d)\n", data_iptype->if_index, data_iptype->iptype); - evt_data.event = IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT; - evt_data.evt_data = data_iptype; - break; - /* End of adding for 8994 Android case */ - - /* Add for embms case */ - case WAN_EMBMS_CONNECT: - memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_wan_msg)); - IPACMDBG("Received WAN_EMBMS_CONNECT name: %s\n",event_wan.upstream_ifname); - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return NULL; - } - ipa_get_if_index(event_wan.upstream_ifname, &(data_fid->if_index)); - evt_data.event = IPA_WAN_EMBMS_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - break; - - case WLAN_SWITCH_TO_SCC: - IPACMDBG_H("Received WLAN_SWITCH_TO_SCC\n"); - case WLAN_WDI_ENABLE: - IPACMDBG_H("Received WLAN_WDI_ENABLE\n"); - if (IPACM_Iface::ipacmcfg->isMCC_Mode == true) - { - IPACM_Iface::ipacmcfg->isMCC_Mode = false; - evt_data.event = IPA_WLAN_SWITCH_TO_SCC; - break; - } - continue; - case WLAN_SWITCH_TO_MCC: - IPACMDBG_H("Received WLAN_SWITCH_TO_MCC\n"); - case WLAN_WDI_DISABLE: - IPACMDBG_H("Received WLAN_WDI_DISABLE\n"); - if (IPACM_Iface::ipacmcfg->isMCC_Mode == false) - { - IPACM_Iface::ipacmcfg->isMCC_Mode = true; - evt_data.event = IPA_WLAN_SWITCH_TO_MCC; - break; - } - continue; - - case WAN_XLAT_CONNECT: - memcpy(&event_wan, buffer + sizeof(struct ipa_msg_meta), - sizeof(struct ipa_wan_msg)); - IPACMDBG_H("Received WAN_XLAT_CONNECT name: %s\n", - event_wan.upstream_ifname); - - /* post IPA_LINK_UP_EVENT event - * may be WAN interface is not up - */ - data_fid = (ipacm_event_data_fid *)calloc(1, sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for xlat event\n"); - return NULL; - } - ipa_get_if_index(event_wan.upstream_ifname, &(data_fid->if_index)); - evt_data.event = IPA_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - IPACMDBG_H("Posting IPA_LINK_UP_EVENT event:%d\n", evt_data.event); - IPACM_EvtDispatcher::PostEvt(&evt_data); - - /* post IPA_WAN_XLAT_CONNECT_EVENT event */ - memset(&evt_data, 0, sizeof(evt_data)); - data_fid = (ipacm_event_data_fid *)calloc(1, sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for xlat event\n"); - return NULL; - } - ipa_get_if_index(event_wan.upstream_ifname, &(data_fid->if_index)); - evt_data.event = IPA_WAN_XLAT_CONNECT_EVENT; - evt_data.evt_data = data_fid; - IPACMDBG_H("Posting IPA_WAN_XLAT_CONNECT_EVENT event:%d\n", evt_data.event); - break; - - case IPA_TETHERING_STATS_UPDATE_STATS: - memcpy(&event_data_stats, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_get_data_stats_resp_msg_v01)); - data_tethering_stats = (ipa_get_data_stats_resp_msg_v01 *)malloc(sizeof(struct ipa_get_data_stats_resp_msg_v01)); - if(data_tethering_stats == NULL) - { - IPACMERR("unable to allocate memory for event data_tethering_stats\n"); - return NULL; - } - memcpy(data_tethering_stats, - &event_data_stats, - sizeof(struct ipa_get_data_stats_resp_msg_v01)); - IPACMDBG("Received IPA_TETHERING_STATS_UPDATE_STATS ipa_stats_type: %d\n",data_tethering_stats->ipa_stats_type); - IPACMDBG("Received %d UL, %d DL pipe stats\n",data_tethering_stats->ul_src_pipe_stats_list_len, data_tethering_stats->dl_dst_pipe_stats_list_len); - evt_data.event = IPA_TETHERING_STATS_UPDATE_EVENT; - evt_data.evt_data = data_tethering_stats; - break; - - case IPA_TETHERING_STATS_UPDATE_NETWORK_STATS: - memcpy(&event_network_stats, buffer + sizeof(struct ipa_msg_meta), sizeof(struct ipa_get_apn_data_stats_resp_msg_v01)); - data_network_stats = (ipa_get_apn_data_stats_resp_msg_v01 *)malloc(sizeof(ipa_get_apn_data_stats_resp_msg_v01)); - if(data_network_stats == NULL) - { - IPACMERR("unable to allocate memory for event data_network_stats\n"); - return NULL; - } - memcpy(data_network_stats, - &event_network_stats, - sizeof(struct ipa_get_apn_data_stats_resp_msg_v01)); - IPACMDBG("Received %d apn network stats \n", data_network_stats->apn_data_stats_list_len); - evt_data.event = IPA_NETWORK_STATS_UPDATE_EVENT; - evt_data.evt_data = data_network_stats; - break; - - default: - IPACMDBG_H("Unhandled message type: %d\n", event_hdr.msg_type); - continue; - - } - /* finish command queue */ - IPACMDBG_H("Posting event:%d\n", evt_data.event); - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* push new_neighbor with netdev device internally */ - if(new_neigh_data != NULL) - { - IPACMDBG_H("Internally post event IPA_NEW_NEIGH_EVENT\n"); - IPACM_EvtDispatcher::PostEvt(&new_neigh_evt); - } - } - - (void)close(fd); - return NULL; -} - -void IPACM_Sig_Handler(int sig) -{ - int cnt; - ipacm_cmd_q_data evt_data; - - printf("Received Signal: %d\n", sig); - memset(&evt_data, 0, sizeof(evt_data)); - - switch(sig) - { - case SIGUSR1: - IPACMDBG_H("Received SW_ROUTING_ENABLE request \n"); - evt_data.event = IPA_SW_ROUTING_ENABLE; - IPACM_Iface::ipacmcfg->ipa_sw_rt_enable = true; - break; - - case SIGUSR2: - IPACMDBG_H("Received SW_ROUTING_DISABLE request \n"); - evt_data.event = IPA_SW_ROUTING_DISABLE; - IPACM_Iface::ipacmcfg->ipa_sw_rt_enable = false; - break; - } - /* finish command queue */ - IPACMDBG_H("Posting event:%d\n", evt_data.event); - IPACM_EvtDispatcher::PostEvt(&evt_data); - return; -} - -void RegisterForSignals(void) -{ - - signal(SIGUSR1, IPACM_Sig_Handler); - signal(SIGUSR2, IPACM_Sig_Handler); -} - - -int main(int argc, char **argv) -{ - int ret; - pthread_t netlink_thread = 0, monitor_thread = 0, ipa_driver_thread = 0; - pthread_t cmd_queue_thread = 0; - - /* check if ipacm is already running or not */ - ipa_is_ipacm_running(); - - IPACMDBG_H("In main()\n"); - IPACM_Neighbor *neigh = new IPACM_Neighbor(); - IPACM_IfaceManager *ifacemgr = new IPACM_IfaceManager(); - -#ifdef FEATURE_ETH_BRIDGE_LE - IPACM_LanToLan* lan2lan = new IPACM_LanToLan(); -#endif - - IPACM_ConntrackClient *cc = IPACM_ConntrackClient::GetInstance(); - CtList = new IPACM_ConntrackListener(); - - IPACMDBG_H("Staring IPA main\n"); - IPACMDBG_H("ipa_cmdq_successful\n"); - - - RegisterForSignals(); - - if (IPACM_SUCCESS == cmd_queue_thread) - { - ret = pthread_create(&cmd_queue_thread, NULL, MessageQueue::Process, NULL); - if (IPACM_SUCCESS != ret) - { - IPACMERR("unable to command queue thread\n"); - return ret; - } - IPACMDBG_H("created command queue thread\n"); - if(pthread_setname_np(cmd_queue_thread, "cmd queue process") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } - - if (IPACM_SUCCESS == netlink_thread) - { - ret = pthread_create(&netlink_thread, NULL, netlink_start, NULL); - if (IPACM_SUCCESS != ret) - { - IPACMERR("unable to create netlink thread\n"); - return ret; - } - IPACMDBG_H("created netlink thread\n"); - if(pthread_setname_np(netlink_thread, "netlink socket") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } - - /* Enable Firewall support only on MDM targets */ -#ifndef FEATURE_IPA_ANDROID - if (IPACM_SUCCESS == monitor_thread) - { - ret = pthread_create(&monitor_thread, NULL, firewall_monitor, NULL); - if (IPACM_SUCCESS != ret) - { - IPACMERR("unable to create monitor thread\n"); - return ret; - } - IPACMDBG_H("created firewall monitor thread\n"); - if(pthread_setname_np(monitor_thread, "firewall cfg process") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } -#endif - - if (IPACM_SUCCESS == ipa_driver_thread) - { - ret = pthread_create(&ipa_driver_thread, NULL, ipa_driver_msg_notifier, NULL); - if (IPACM_SUCCESS != ret) - { - IPACMERR("unable to create ipa_driver_wlan thread\n"); - return ret; - } - IPACMDBG_H("created ipa_driver_wlan thread\n"); - if(pthread_setname_np(ipa_driver_thread, "ipa driver ntfy") != 0) - { - IPACMERR("unable to set thread name\n"); - } - } - - pthread_join(cmd_queue_thread, NULL); - pthread_join(netlink_thread, NULL); - pthread_join(monitor_thread, NULL); - pthread_join(ipa_driver_thread, NULL); - return IPACM_SUCCESS; -} - -/*=========================================================================== - FUNCTION ipa_is_ipacm_running -===========================================================================*/ -/*! -@brief - Determine whether there's already an IPACM process running, if so, terminate - the current one - -@return - None - -@note - -- Dependencies - - None - -- Side Effects - - None -*/ -/*=========================================================================*/ - -void ipa_is_ipacm_running(void) { - - int fd; - struct flock lock; - int retval; - - fd = open(IPACM_PID_FILE, O_RDWR | O_CREAT, 0600); - if ( fd <= 0 ) - { - IPACMERR("Failed to open %s, error is %d - %s\n", - IPACM_PID_FILE, errno, strerror(errno)); - exit(0); - } - - /* - * Getting an exclusive Write lock on the file, if it fails, - * it means that another instance of IPACM is running and it - * got the lock before us. - */ - memset(&lock, 0, sizeof(lock)); - lock.l_type = F_WRLCK; - retval = fcntl(fd, F_SETLK, &lock); - - if (retval != 0) - { - retval = fcntl(fd, F_GETLK, &lock); - if (retval == 0) - { - IPACMERR("Unable to get lock on file %s (my PID %d), PID %d already has it\n", - IPACM_PID_FILE, getpid(), lock.l_pid); - close(fd); - exit(0); - } - } - else - { - IPACMERR("PID %d is IPACM main process\n", getpid()); - } - - return; -} - -/*=========================================================================== - FUNCTION ipa_get_if_index -===========================================================================*/ -/*! -@brief - get ipa interface index by given the interface name - -@return - IPACM_SUCCESS or IPA_FALUIRE - -@note - -- Dependencies - - None - -- Side Effects - - None -*/ -/*=========================================================================*/ -int ipa_get_if_index -( - char *if_name, - int *if_index - ) -{ - int fd; - struct ifreq ifr; - - if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - PERROR("get interface index socket create failed"); - return IPACM_FAILURE; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - - (void)strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name)); - - if (ioctl(fd, SIOCGIFINDEX, &ifr) < 0) - { - IPACMERR("call_ioctl_on_dev: ioctl failed: can't find device %s",if_name); - *if_index = -1; - close(fd); - return IPACM_FAILURE; - } - - *if_index = ifr.ifr_ifindex; - close(fd); - return IPACM_SUCCESS; -} diff --git a/ipacm/src/IPACM_Neighbor.cpp b/ipacm/src/IPACM_Neighbor.cpp deleted file mode 100644 index b96cebb..0000000 --- a/ipacm/src/IPACM_Neighbor.cpp +++ /dev/null @@ -1,570 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Neighbor.cpp - - @brief - This file implements the functionality of handling IPACM Neighbor events. - - @Author - Skylar Chang - -*/ - -#include <sys/ioctl.h> -#include <IPACM_Neighbor.h> -#include <IPACM_EvtDispatcher.h> -#include "IPACM_Defs.h" -#include "IPACM_Log.h" - - -IPACM_Neighbor::IPACM_Neighbor() -{ - num_neighbor_client = 0; - circular_index = 0; - memset(neighbor_client, 0, IPA_MAX_NUM_NEIGHBOR_CLIENTS * sizeof(ipa_neighbor_client)); - IPACM_EvtDispatcher::registr(IPA_WLAN_CLIENT_ADD_EVENT_EX, this); - IPACM_EvtDispatcher::registr(IPA_NEW_NEIGH_EVENT, this); - IPACM_EvtDispatcher::registr(IPA_DEL_NEIGH_EVENT, this); - return; -} - -void IPACM_Neighbor::event_callback(ipa_cm_event_id event, void *param) -{ - ipacm_event_data_all *data_all = NULL; - int i, ipa_interface_index; - ipacm_cmd_q_data evt_data; - int num_neighbor_client_temp = num_neighbor_client; - - IPACMDBG("Recieved event %d\n", event); - - switch (event) - { - case IPA_WLAN_CLIENT_ADD_EVENT_EX: - { - ipacm_event_data_wlan_ex *data = (ipacm_event_data_wlan_ex *)param; - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("IPA_WLAN_CLIENT_ADD_EVENT_EX: not supported iface id: %d\n", data->if_index); - break; - } - uint8_t client_mac_addr[6] = {0}; - - IPACMDBG_H("Received IPA_WLAN_CLIENT_ADD_EVENT\n"); - for(i = 0; i < data->num_of_attribs; i++) - { - if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR) - { - memcpy(client_mac_addr, - data->attribs[i].u.mac_addr, - sizeof(client_mac_addr)); - IPACMDBG_H("AP Mac Address %02x:%02x:%02x:%02x:%02x:%02x\n", - client_mac_addr[0], client_mac_addr[1], client_mac_addr[2], - client_mac_addr[3], client_mac_addr[4], client_mac_addr[5]); - } - else - { - IPACMDBG_H("The attribute type is not expected!\n"); - } - } - - for (i = 0; i < num_neighbor_client_temp; i++) - { - /* find the client */ - if (memcmp(neighbor_client[i].mac_addr, client_mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0) - { - /* check if iface is not bridge interface*/ - if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) != 0) - { - /* use previous ipv4 first */ - if(data->if_index != neighbor_client[i].iface_index) - { - IPACMERR("update new kernel iface index \n"); - neighbor_client[i].iface_index = data->if_index; - } - - /* check if client associated with previous network interface */ - if(ipa_interface_index != neighbor_client[i].ipa_if_num) - { - IPACMERR("client associate to different AP \n"); - return; - } - - if (neighbor_client[i].v4_addr != 0) /* not 0.0.0.0 */ - { - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT; - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if (data_all == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - data_all->iptype = IPA_IP_v4; - data_all->if_index = neighbor_client[i].iface_index; - data_all->ipv4_addr = neighbor_client[i].v4_addr; //use previous ipv4 address - memcpy(data_all->mac_addr, - neighbor_client[i].mac_addr, - sizeof(data_all->mac_addr)); - evt_data.evt_data = (void *)data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* ask for replaced iface name*/ - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("not supported iface id: %d\n", data_all->if_index); - } else { - IPACMDBG_H("Posted event %d, with %s for ipv4 client re-connect\n", - evt_data.event, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - } - } - } - break; - } - } - } - break; - - default: - { - if (event == IPA_NEW_NEIGH_EVENT) - { - IPACMDBG_H("Received IPA_NEW_NEIGH_EVENT\n"); - } - else - { - IPACMDBG_H("Received IPA_DEL_NEIGH_EVENT\n"); - } - - ipacm_event_data_all *data = (ipacm_event_data_all *)param; - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("not supported iface id: %d\n", data->if_index); - break; - } - if (data->iptype == IPA_IP_v4) - { - if (data->ipv4_addr != 0) /* not 0.0.0.0 */ - { - IPACMDBG("Got Neighbor event with ipv4 address: 0x%x \n", data->ipv4_addr); - /* check if ipv4 address is link local(169.254.xxx.xxx) */ - if ((data->ipv4_addr & IPV4_ADDR_LINKLOCAL_MASK) == IPV4_ADDR_LINKLOCAL) - { - IPACMDBG_H("This is link local ipv4 address: 0x%x : ignore this NEIGH_EVENT\n", data->ipv4_addr); - return; - } - /* check if iface is bridge interface*/ - if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) == 0) - { - /* searh if seen this client or not*/ - for (i = 0; i < num_neighbor_client_temp; i++) - { - if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0) - { - data->if_index = neighbor_client[i].iface_index; - neighbor_client[i].v4_addr = data->ipv4_addr; // cache client's previous ipv4 address - /* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */ - if (event == IPA_NEW_NEIGH_EVENT) - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT; - else - /* not to clean-up the client mac cache on bridge0 delneigh */ - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT; - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if (data_all == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - memcpy(data_all, data, sizeof(ipacm_event_data_all)); - evt_data.evt_data = (void *)data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - - /* ask for replaced iface name*/ - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("not supported iface id: %d\n", data_all->if_index); - } else { - IPACMDBG_H("Posted event %d,\ - with %s for ipv4\n", - evt_data.event, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - } - break; - } - } - } - else - { - /* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */ - if (event == IPA_NEW_NEIGH_EVENT) - { - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT; - /* Also save to cache for ipv4 */ - /*searh if seen this client or not*/ - for (i = 0; i < num_neighbor_client_temp; i++) - { - /* find the client */ - if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0) - { - /* update the network interface client associated */ - neighbor_client[i].iface_index = data->if_index; - neighbor_client[i].ipa_if_num = ipa_interface_index; - neighbor_client[i].v4_addr = data->ipv4_addr; // cache client's previous ipv4 address - IPACMDBG_H("update cache %d-entry, with %s iface, ipv4 address: 0x%x\n", - i, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name, - data->ipv4_addr); - break; - } - } - /* not find client */ - if (i == num_neighbor_client_temp) - { - if (num_neighbor_client_temp < IPA_MAX_NUM_NEIGHBOR_CLIENTS) - { - memcpy(neighbor_client[num_neighbor_client_temp].mac_addr, - data->mac_addr, - sizeof(data->mac_addr)); - neighbor_client[num_neighbor_client_temp].iface_index = data->if_index; - /* cache the network interface client associated */ - neighbor_client[num_neighbor_client_temp].ipa_if_num = ipa_interface_index; - neighbor_client[num_neighbor_client_temp].v4_addr = data->ipv4_addr; - num_neighbor_client++; - IPACMDBG_H("Cache client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n", - neighbor_client[num_neighbor_client_temp].mac_addr[0], - neighbor_client[num_neighbor_client_temp].mac_addr[1], - neighbor_client[num_neighbor_client_temp].mac_addr[2], - neighbor_client[num_neighbor_client_temp].mac_addr[3], - neighbor_client[num_neighbor_client_temp].mac_addr[4], - neighbor_client[num_neighbor_client_temp].mac_addr[5], - num_neighbor_client); - } - else - { - - IPACMERR("error: neighbor client oversize! recycle %d-st entry ! \n", circular_index); - memcpy(neighbor_client[circular_index].mac_addr, - data->mac_addr, - sizeof(data->mac_addr)); - neighbor_client[circular_index].iface_index = data->if_index; - /* cache the network interface client associated */ - neighbor_client[circular_index].ipa_if_num = ipa_interface_index; - neighbor_client[circular_index].v4_addr = 0; - IPACMDBG_H("Copy wlan-iface client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d, circular %d\n", - neighbor_client[circular_index].mac_addr[0], - neighbor_client[circular_index].mac_addr[1], - neighbor_client[circular_index].mac_addr[2], - neighbor_client[circular_index].mac_addr[3], - neighbor_client[circular_index].mac_addr[4], - neighbor_client[circular_index].mac_addr[5], - num_neighbor_client, - circular_index); - circular_index++; - } - } - } - else - { - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT; - /*searh if seen this client or not*/ - for (i = 0; i < num_neighbor_client_temp; i++) - { - /* find the client */ - if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0) - { - IPACMDBG_H("Clean %d-st Cached client-MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n", - i, - neighbor_client[i].mac_addr[0], - neighbor_client[i].mac_addr[1], - neighbor_client[i].mac_addr[2], - neighbor_client[i].mac_addr[3], - neighbor_client[i].mac_addr[4], - neighbor_client[i].mac_addr[5], - num_neighbor_client); - - memset(neighbor_client[i].mac_addr, 0, sizeof(neighbor_client[i].mac_addr)); - neighbor_client[i].iface_index = 0; - neighbor_client[i].v4_addr = 0; - neighbor_client[i].ipa_if_num = 0; - for (; i < num_neighbor_client_temp - 1; i++) - { - memcpy(neighbor_client[i].mac_addr, - neighbor_client[i+1].mac_addr, - sizeof(neighbor_client[i].mac_addr)); - neighbor_client[i].iface_index = neighbor_client[i+1].iface_index; - neighbor_client[i].v4_addr = neighbor_client[i+1].v4_addr; - neighbor_client[i].ipa_if_num = neighbor_client[i+1].ipa_if_num; - } - num_neighbor_client--; - IPACMDBG_H(" total number of left cased clients: %d\n", num_neighbor_client); - break; - } - } - /* not find client, no need clean-up */ - } - - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if (data_all == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - memcpy(data_all, data, sizeof(ipacm_event_data_all)); - evt_data.evt_data = (void *)data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - IPACMDBG_H("Posted event %d with %s for ipv4\n", - evt_data.event, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - } - } - } - else - { //ipv6 starts - - if ((data->ipv6_addr[0]) || (data->ipv6_addr[1]) || (data->ipv6_addr[2]) || (data->ipv6_addr[3])) - { - IPACMDBG("Got New_Neighbor event with ipv6 address \n"); - /* check if iface is bridge interface*/ - if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) == 0) - { - /* searh if seen this client or not*/ - for (i = 0; i < num_neighbor_client_temp; i++) - { - if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0) - { - data->if_index = neighbor_client[i].iface_index; - /* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */ - if (event == IPA_NEW_NEIGH_EVENT) evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT; - else evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT; - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if (data_all == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - memcpy(data_all, data, sizeof(ipacm_event_data_all)); - evt_data.evt_data = (void *)data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* ask for replaced iface name*/ - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("not supported iface id: %d\n", data_all->if_index); - } else { - IPACMDBG_H("Posted event %d,\ - with %s for ipv6\n", - evt_data.event, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - } - break; - }; - } - } - else - { - /* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */ - if (event == IPA_NEW_NEIGH_EVENT) - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT; - else - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT; - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if (data_all == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - memcpy(data_all, data, sizeof(ipacm_event_data_all)); - evt_data.evt_data = (void *)data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - IPACMDBG_H("Posted event %d with %s for ipv6\n", - evt_data.event, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - } - } - else - { - IPACMDBG(" Got Neighbor event with no ipv6/ipv4 address \n"); - /*no ipv6 in data searh if seen this client or not*/ - for (i = 0; i < num_neighbor_client_temp; i++) - { - /* find the client */ - if (memcmp(neighbor_client[i].mac_addr, data->mac_addr, sizeof(neighbor_client[i].mac_addr)) == 0) - { - IPACMDBG_H(" find %d-st client, MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n", - i, - neighbor_client[i].mac_addr[0], - neighbor_client[i].mac_addr[1], - neighbor_client[i].mac_addr[2], - neighbor_client[i].mac_addr[3], - neighbor_client[i].mac_addr[4], - neighbor_client[i].mac_addr[5], - num_neighbor_client); - /* check if iface is not bridge interface*/ - if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) != 0) - { - /* use previous ipv4 first */ - if(data->if_index != neighbor_client[i].iface_index) - { - IPACMDBG_H("update new kernel iface index \n"); - neighbor_client[i].iface_index = data->if_index; - } - - /* check if client associated with previous network interface */ - if(ipa_interface_index != neighbor_client[i].ipa_if_num) - { - IPACMDBG_H("client associate to different AP \n"); - } - - if (neighbor_client[i].v4_addr != 0) /* not 0.0.0.0 */ - { - /* construct IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT command and insert to command-queue */ - if (event == IPA_NEW_NEIGH_EVENT) - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT; - else - evt_data.event = IPA_NEIGH_CLIENT_IP_ADDR_DEL_EVENT; - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if (data_all == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - data_all->iptype = IPA_IP_v4; - data_all->if_index = neighbor_client[i].iface_index; - data_all->ipv4_addr = neighbor_client[i].v4_addr; //use previous ipv4 address - memcpy(data_all->mac_addr, - neighbor_client[i].mac_addr, - sizeof(data_all->mac_addr)); - evt_data.evt_data = (void *)data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* ask for replaced iface name*/ - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data_all->if_index); - /* check for failure return */ - if (IPACM_FAILURE == ipa_interface_index) { - IPACMERR("not supported iface id: %d\n", data_all->if_index); - } else { - IPACMDBG_H("Posted event %d,\ - with %s for ipv4 client re-connect\n", - evt_data.event, - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - } - } - } - /* delete cache neighbor entry */ - if (event == IPA_DEL_NEIGH_EVENT) - { - IPACMDBG_H("Clean %d-st Cached client-MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n", - i, - neighbor_client[i].mac_addr[0], - neighbor_client[i].mac_addr[1], - neighbor_client[i].mac_addr[2], - neighbor_client[i].mac_addr[3], - neighbor_client[i].mac_addr[4], - neighbor_client[i].mac_addr[5], - num_neighbor_client); - - memset(neighbor_client[i].mac_addr, 0, sizeof(neighbor_client[i].mac_addr)); - neighbor_client[i].iface_index = 0; - neighbor_client[i].v4_addr = 0; - neighbor_client[i].ipa_if_num = 0; - for (; i < num_neighbor_client_temp - 1; i++) - { - memcpy(neighbor_client[i].mac_addr, - neighbor_client[i+1].mac_addr, - sizeof(neighbor_client[i].mac_addr)); - neighbor_client[i].iface_index = neighbor_client[i+1].iface_index; - neighbor_client[i].v4_addr = neighbor_client[i+1].v4_addr; - neighbor_client[i].ipa_if_num = neighbor_client[i+1].ipa_if_num; - } - num_neighbor_client--; - IPACMDBG_H(" total number of left cased clients: %d\n", num_neighbor_client); - } - break; - } - } - /* not find client */ - if ((i == num_neighbor_client_temp) && (event == IPA_NEW_NEIGH_EVENT)) - { - /* check if iface is not bridge interface*/ - if (strcmp(IPACM_Iface::ipacmcfg->ipa_virtual_iface_name, IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name) != 0) - { - if (num_neighbor_client_temp < IPA_MAX_NUM_NEIGHBOR_CLIENTS) - { - memcpy(neighbor_client[num_neighbor_client_temp].mac_addr, - data->mac_addr, - sizeof(data->mac_addr)); - neighbor_client[num_neighbor_client_temp].iface_index = data->if_index; - /* cache the network interface client associated */ - neighbor_client[num_neighbor_client_temp].ipa_if_num = ipa_interface_index; - neighbor_client[num_neighbor_client_temp].v4_addr = 0; - num_neighbor_client++; - IPACMDBG_H("Copy client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d\n", - neighbor_client[num_neighbor_client_temp].mac_addr[0], - neighbor_client[num_neighbor_client_temp].mac_addr[1], - neighbor_client[num_neighbor_client_temp].mac_addr[2], - neighbor_client[num_neighbor_client_temp].mac_addr[3], - neighbor_client[num_neighbor_client_temp].mac_addr[4], - neighbor_client[num_neighbor_client_temp].mac_addr[5], - num_neighbor_client); - return; - } - else - { - IPACMERR("error: neighbor client oversize! recycle %d-st entry ! \n", circular_index); - memcpy(neighbor_client[circular_index].mac_addr, - data->mac_addr, - sizeof(data->mac_addr)); - neighbor_client[circular_index].iface_index = data->if_index; - /* cache the network interface client associated */ - neighbor_client[circular_index].ipa_if_num = ipa_interface_index; - neighbor_client[circular_index].v4_addr = 0; - IPACMDBG_H("Copy wlan-iface client MAC %02x:%02x:%02x:%02x:%02x:%02x\n, total client: %d, circular %d\n", - neighbor_client[circular_index].mac_addr[0], - neighbor_client[circular_index].mac_addr[1], - neighbor_client[circular_index].mac_addr[2], - neighbor_client[circular_index].mac_addr[3], - neighbor_client[circular_index].mac_addr[4], - neighbor_client[circular_index].mac_addr[5], - num_neighbor_client, - circular_index); - circular_index++; - return; - } - } - } - } - } //ipv6 ends - } - break; - } - return; -} diff --git a/ipacm/src/IPACM_Netlink.cpp b/ipacm/src/IPACM_Netlink.cpp deleted file mode 100644 index 30295b1..0000000 --- a/ipacm/src/IPACM_Netlink.cpp +++ /dev/null @@ -1,1773 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -* Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Netlink.cpp - - @brief - This file implements the IPAM Netlink Socket Parer functionality. - - @Author - Skylar Chang - -*/ -#include <string.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <netinet/in.h> -#include "IPACM_CmdQueue.h" -#include "IPACM_Defs.h" -#include "IPACM_Netlink.h" -#include "IPACM_EvtDispatcher.h" -#include "IPACM_Log.h" - -int ipa_get_if_name(char *if_name, int if_index); -int find_mask(int ip_v4_last, int *mask_value); - -#ifdef FEATURE_IPA_ANDROID - -#define IPACM_NL_COPY_ADDR( event_info, element ) \ - memcpy( &event_info->attr_info.element.__data, \ - RTA_DATA(rtah), \ - sizeof(event_info->attr_info.element.__data) ); - -#define IPACM_EVENT_COPY_ADDR_v6( event_data, element) \ - memcpy( event_data, element.__data, sizeof(event_data)); - -#define IPACM_EVENT_COPY_ADDR_v4( event_data, element) \ - memcpy( &event_data, element.__data, sizeof(event_data)); - -#define IPACM_NL_REPORT_ADDR( prefix, addr ) \ - if( AF_INET6 == (addr).ss_family ) { \ - IPACM_LOG_IPV6_ADDR( prefix, addr.__data); \ - } else { \ - IPACM_LOG_IPV4_ADDR( prefix, (*(unsigned int*)&(addr).__data) ); \ - } - -#else/* defined(FEATURE_IPA_ANDROID) */ - -#define IPACM_NL_COPY_ADDR( event_info, element ) \ - memcpy( &event_info->attr_info.element.__ss_padding, \ - RTA_DATA(rtah), \ - sizeof(event_info->attr_info.element.__ss_padding) ); - -#define IPACM_EVENT_COPY_ADDR_v6( event_data, element) \ - memcpy( event_data, element.__ss_padding, sizeof(event_data)); - -#define IPACM_EVENT_COPY_ADDR_v4( event_data, element) \ - memcpy( &event_data, element.__ss_padding, sizeof(event_data)); - -#define IPACM_NL_REPORT_ADDR( prefix, addr ) \ - if( AF_INET6 == (addr).ss_family ) { \ - IPACM_LOG_IPV6_ADDR( prefix, addr.__ss_padding); \ - } else { \ - IPACM_LOG_IPV4_ADDR( prefix, (*(unsigned int*)&(addr).__ss_padding) ); \ - } -#endif /* defined(FEATURE_IPA_ANDROID)*/ - -#define NDA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ndmsg)))) -#define IPACM_LOG_IPV6_ADDR(prefix, ip_addr) \ - IPACMDBG_H(prefix); \ - IPACMDBG_H(" IPV6 Address %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\n", \ - (int)ip_addr[0], (int)ip_addr[1], \ - (int)ip_addr[2], (int)ip_addr[3], \ - (int)ip_addr[4], (int)ip_addr[5], \ - (int)ip_addr[6], (int)ip_addr[7], \ - (int)ip_addr[8], (int)ip_addr[9], \ - (int)ip_addr[10], (int)ip_addr[11], \ - (int)ip_addr[12], (int)ip_addr[13], \ - (int)ip_addr[14], (int)ip_addr[15]); - -#define IPACM_LOG_IPV4_ADDR(prefix, ip_addr) \ - IPACMDBG_H(prefix); \ - IPACMDBG_H(" IPV4 Address %d.%d.%d.%d\n", \ - (unsigned char)(ip_addr), \ - (unsigned char)(ip_addr >> 8), \ - (unsigned char)(ip_addr >> 16) , \ - (unsigned char)(ip_addr >> 24)); - -/* Opens a netlink socket*/ -static int ipa_nl_open_socket -( - ipa_nl_sk_info_t *sk_info, - int protocol, - unsigned int grps - ) -{ - int *p_sk_fd; - int buf_size = 6669999, sendbuff=0, res; - struct sockaddr_nl *p_sk_addr_loc; - socklen_t optlen; - - p_sk_fd = &(sk_info->sk_fd); - p_sk_addr_loc = &(sk_info->sk_addr_loc); - - /* Open netlink socket for specified protocol */ - if((*p_sk_fd = socket(AF_NETLINK, SOCK_RAW, protocol)) < 0) - { - IPACMERR("cannot open netlink socket\n"); - return IPACM_FAILURE; - } - - optlen = sizeof(sendbuff); - res = getsockopt(*p_sk_fd, SOL_SOCKET, SO_SNDBUF, &sendbuff, &optlen); - - if(res == -1) { - IPACMDBG("Error getsockopt one"); - } else { - IPACMDBG("orignal send buffer size = %d\n", sendbuff); - } - IPACMDBG("sets the send buffer to %d\n", buf_size); - if (setsockopt(*p_sk_fd, SOL_SOCKET, SO_RCVBUF, &buf_size, sizeof(int)) == -1) { - IPACMERR("Error setting socket opts\n"); - } - - /* Initialize socket addresses to null */ - memset(p_sk_addr_loc, 0, sizeof(struct sockaddr_nl)); - - /* Populate local socket address using specified groups */ - p_sk_addr_loc->nl_family = AF_NETLINK; - p_sk_addr_loc->nl_pid = getpid(); - p_sk_addr_loc->nl_groups = grps; - - /* Bind socket to the local address, i.e. specified groups. This ensures - that multicast messages for these groups are delivered over this - socket. */ - - if(bind(*p_sk_fd, - (struct sockaddr *)p_sk_addr_loc, - sizeof(struct sockaddr_nl)) < 0) - { - IPACMERR("Socket bind failed\n"); - return IPACM_FAILURE; - } - - return IPACM_SUCCESS; -} - -/* Add fd to fdmap array and store read handler function ptr (up to MAX_NUM_OF_FD).*/ -static int ipa_nl_addfd_map -( - ipa_nl_sk_fd_set_info_t *info, - int fd, - ipa_sock_thrd_fd_read_f read_f - ) -{ - if(info->num_fd < MAX_NUM_OF_FD) - { - FD_SET(fd, &info->fdset); - - /* Add fd to fdmap array and store read handler function ptr */ - info->sk_fds[info->num_fd].sk_fd = fd; - info->sk_fds[info->num_fd].read_func = read_f; - - /* Increment number of fds stored in fdmap */ - info->num_fd++; - if(info->max_fd < fd) - info->max_fd = fd; - } - else - { - return IPACM_FAILURE; - } - - return IPACM_SUCCESS; -} - -/* start socket listener */ -static int ipa_nl_sock_listener_start -( - ipa_nl_sk_fd_set_info_t *sk_fd_set - ) -{ - int i, ret; - - while(true) - { - for(i = 0; i < sk_fd_set->num_fd; i++ ) - { - FD_SET(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset)); - } - - if((ret = select(sk_fd_set->max_fd + 1, &(sk_fd_set->fdset), NULL, NULL, NULL)) < 0) - { - IPACMERR("ipa_nl select failed\n"); - } - else - { - for(i = 0; i < sk_fd_set->num_fd; i++) - { - - if(FD_ISSET(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset))) - { - - if(sk_fd_set->sk_fds[i].read_func) - { - if(IPACM_SUCCESS != ((sk_fd_set->sk_fds[i].read_func)(sk_fd_set->sk_fds[i].sk_fd))) - { - IPACMERR("Error on read callback[%d] fd=%d\n", - i, - sk_fd_set->sk_fds[i].sk_fd); - } - FD_CLR(sk_fd_set->sk_fds[i].sk_fd, &(sk_fd_set->fdset)); - } - else - { - IPACMERR("No read function\n"); - } - } - - } /* end of for loop*/ - } /* end of else */ - } /* end of while */ - - return IPACM_SUCCESS; -} - -/* allocate memory for ipa_nl__msg */ -static struct msghdr* ipa_nl_alloc_msg -( - uint32_t msglen - ) -{ - unsigned char *buf = NULL; - struct sockaddr_nl *nladdr = NULL; - struct iovec *iov = NULL; - struct msghdr *msgh = NULL; - - if(IPA_NL_MSG_MAX_LEN < msglen) - { - IPACMERR("Netlink message exceeds maximum length\n"); - return NULL; - } - - msgh = (struct msghdr *)malloc(sizeof(struct msghdr)); - if(msgh == NULL) - { - IPACMERR("Failed malloc for msghdr\n"); - return NULL; - } - - nladdr = (struct sockaddr_nl *)malloc(sizeof(struct sockaddr_nl)); - if(nladdr == NULL) - { - IPACMERR("Failed malloc for sockaddr\n"); - free(msgh); - return NULL; - } - - iov = (struct iovec *)malloc(sizeof(struct iovec)); - if(iov == NULL) - { - PERROR("Failed malloc for iovec"); - free(nladdr); - free(msgh); - return NULL; - } - - buf = (unsigned char *)malloc(msglen); - if(buf == NULL) - { - IPACMERR("Failed malloc for mglen\n"); - free(iov); - free(nladdr); - free(msgh); - return NULL; - } - - memset(nladdr, 0, sizeof(struct sockaddr_nl)); - nladdr->nl_family = AF_NETLINK; - - memset(msgh, 0x0, sizeof(struct msghdr)); - msgh->msg_name = nladdr; - msgh->msg_namelen = sizeof(struct sockaddr_nl); - msgh->msg_iov = iov; - msgh->msg_iovlen = 1; - - memset(iov, 0x0, sizeof(struct iovec)); - iov->iov_base = buf; - iov->iov_len = msglen; - - return msgh; -} - -/* release IPA message */ -static void ipa_nl_release_msg -( - struct msghdr *msgh - ) -{ - unsigned char *buf = NULL; - struct sockaddr_nl *nladdr = NULL; - struct iovec *iov = NULL; - - if(NULL == msgh) - { - return; - } - - nladdr = (struct sockaddr_nl *)msgh->msg_name; - iov = msgh->msg_iov; - if(msgh->msg_iov) - { - buf = (unsigned char *)msgh->msg_iov->iov_base; - } - - if(buf) - { - free(buf); - } - if(iov) - { - free(iov); - } - if(nladdr) - { - free(nladdr); - } - if(msgh) - { - free(msgh); - } - return; -} - -/* receive and process nl message */ -static int ipa_nl_recv -( - int fd, - struct msghdr **msg_pptr, - unsigned int *msglen_ptr - ) -{ - struct msghdr *msgh = NULL; - int rmsgl; - - msgh = ipa_nl_alloc_msg(IPA_NL_MSG_MAX_LEN); - if(NULL == msgh) - { - IPACMERR("Failed to allocate NL message\n"); - goto error; - } - - - /* Receive message over the socket */ - rmsgl = recvmsg(fd, msgh, 0); - - /* Verify that something was read */ - if(rmsgl <= 0) - { - PERROR("NL recv error"); - goto error; - } - - /* Verify that NL address length in the received message is expected value */ - if(sizeof(struct sockaddr_nl) != msgh->msg_namelen) - { - IPACMERR("rcvd msg with namelen != sizeof sockaddr_nl\n"); - goto error; - } - - /* Verify that message was not truncated. This should not occur */ - if(msgh->msg_flags & MSG_TRUNC) - { - IPACMERR("Rcvd msg truncated!\n"); - goto error; - } - - *msg_pptr = msgh; - *msglen_ptr = rmsgl; - - return IPACM_SUCCESS; - -/* An error occurred while receiving the message. Free all memory before - returning. */ -error: - ipa_nl_release_msg(msgh); - *msg_pptr = NULL; - *msglen_ptr = 0; - - return IPACM_FAILURE; -} - -/* decode the rtm netlink message */ -static int ipa_nl_decode_rtm_link -( - const char *buffer, - unsigned int buflen, - ipa_nl_link_info_t *link_info -) -{ - struct rtattr; - /* NL message header */ - struct nlmsghdr *nlh = (struct nlmsghdr *)buffer; - - /* Extract the header data */ - link_info->metainfo = *(struct ifinfomsg *)NLMSG_DATA(nlh); - buflen -= sizeof(struct nlmsghdr); - - return IPACM_SUCCESS; -} - -/* Decode kernel address message parameters from Netlink attribute TLVs. */ -static int ipa_nl_decode_rtm_addr -( - const char *buffer, - unsigned int buflen, - ipa_nl_addr_info_t *addr_info - ) -{ - struct nlmsghdr *nlh = (struct nlmsghdr *)buffer; /* NL message header */ - struct rtattr *rtah = NULL; - - /* Extract the header data */ - addr_info->metainfo = *((struct ifaddrmsg *)NLMSG_DATA(nlh)); - buflen -= sizeof(struct nlmsghdr); - - /* Extract the available attributes */ - addr_info->attr_info.param_mask = IPA_NLA_PARAM_NONE; - - rtah = IFA_RTA(NLMSG_DATA(nlh)); - - while(RTA_OK(rtah, buflen)) - { - switch(rtah->rta_type) - { - - case IFA_ADDRESS: - addr_info->attr_info.prefix_addr.ss_family = addr_info->metainfo.ifa_family; - IPACM_NL_COPY_ADDR( addr_info, prefix_addr ); - addr_info->attr_info.param_mask |= IPA_NLA_PARAM_PREFIXADDR; - break; - default: - break; - - } - /* Advance to next attribute */ - rtah = RTA_NEXT(rtah, buflen); - } - - return IPACM_SUCCESS; -} - -/* Decode kernel neighbor message parameters from Netlink attribute TLVs. */ -static int ipa_nl_decode_rtm_neigh -( - const char *buffer, - unsigned int buflen, - ipa_nl_neigh_info_t *neigh_info - ) -{ - struct nlmsghdr *nlh = (struct nlmsghdr *)buffer; /* NL message header */ - struct rtattr *rtah = NULL; - - /* Extract the header data */ - neigh_info->metainfo = *((struct ndmsg *)NLMSG_DATA(nlh)); - buflen -= sizeof(struct nlmsghdr); - - /* Extract the available attributes */ - neigh_info->attr_info.param_mask = IPA_NLA_PARAM_NONE; - - rtah = NDA_RTA(NLMSG_DATA(nlh)); - - while(RTA_OK(rtah, buflen)) - { - switch(rtah->rta_type) - { - - case NDA_DST: - neigh_info->attr_info.local_addr.ss_family = neigh_info->metainfo.ndm_family; - IPACM_NL_COPY_ADDR( neigh_info, local_addr ); - break; - - case NDA_LLADDR: - memcpy(neigh_info->attr_info.lladdr_hwaddr.sa_data, - RTA_DATA(rtah), - sizeof(neigh_info->attr_info.lladdr_hwaddr.sa_data)); - break; - - default: - break; - - } - - /* Advance to next attribute */ - rtah = RTA_NEXT(rtah, buflen); - } - - return IPACM_SUCCESS; -} - -/* Decode kernel route message parameters from Netlink attribute TLVs. */ -static int ipa_nl_decode_rtm_route -( - const char *buffer, - unsigned int buflen, - ipa_nl_route_info_t *route_info - ) -{ - struct nlmsghdr *nlh = (struct nlmsghdr *)buffer; /* NL message header */ - struct rtattr *rtah = NULL; - - /* Extract the header data */ - route_info->metainfo = *((struct rtmsg *)NLMSG_DATA(nlh)); - buflen -= sizeof(struct nlmsghdr); - - route_info->attr_info.param_mask = IPA_RTA_PARAM_NONE; - rtah = RTM_RTA(NLMSG_DATA(nlh)); - - while(RTA_OK(rtah, buflen)) - { - switch(rtah->rta_type) - { - - case RTA_DST: - route_info->attr_info.dst_addr.ss_family = route_info->metainfo.rtm_family; - IPACM_NL_COPY_ADDR( route_info, dst_addr ); - route_info->attr_info.param_mask |= IPA_RTA_PARAM_DST; - break; - - case RTA_SRC: - route_info->attr_info.src_addr.ss_family = route_info->metainfo.rtm_family; - IPACM_NL_COPY_ADDR( route_info, src_addr ); - route_info->attr_info.param_mask |= IPA_RTA_PARAM_SRC; - break; - - case RTA_GATEWAY: - route_info->attr_info.gateway_addr.ss_family = route_info->metainfo.rtm_family; - IPACM_NL_COPY_ADDR( route_info, gateway_addr ); - route_info->attr_info.param_mask |= IPA_RTA_PARAM_GATEWAY; - break; - - case RTA_IIF: - memcpy(&route_info->attr_info.iif_index, - RTA_DATA(rtah), - sizeof(route_info->attr_info.iif_index)); - route_info->attr_info.param_mask |= IPA_RTA_PARAM_IIF; - break; - - case RTA_OIF: - memcpy(&route_info->attr_info.oif_index, - RTA_DATA(rtah), - sizeof(route_info->attr_info.oif_index)); - route_info->attr_info.param_mask |= IPA_RTA_PARAM_OIF; - break; - - case RTA_PRIORITY: - memcpy(&route_info->attr_info.priority, - RTA_DATA(rtah), - sizeof(route_info->attr_info.priority)); - route_info->attr_info.param_mask |= IPA_RTA_PARAM_PRIORITY; - break; - - default: - break; - - } - - /* Advance to next attribute */ - rtah = RTA_NEXT(rtah, buflen); - } - - return IPACM_SUCCESS; -} - -/* decode the ipa nl-message */ -static int ipa_nl_decode_nlmsg -( - const char *buffer, - unsigned int buflen, - ipa_nl_msg_t *msg_ptr - ) -{ - char dev_name[IF_NAME_LEN]={0}; - int ret_val, mask_value, mask_index, mask_value_v6; - struct nlmsghdr *nlh = (struct nlmsghdr *)buffer; - - uint32_t if_ipv4_addr =0, if_ipipv4_addr_mask =0, temp =0, if_ipv4_addr_gw =0; - - ipacm_cmd_q_data evt_data; - ipacm_event_data_all *data_all; - ipacm_event_data_fid *data_fid; - ipacm_event_data_addr *data_addr; - - - while(NLMSG_OK(nlh, buflen)) - { - memset(dev_name,0,IF_NAME_LEN); - IPACMDBG("Received msg:%d from netlink\n", nlh->nlmsg_type) - switch(nlh->nlmsg_type) - { - case RTM_NEWLINK: - msg_ptr->type = nlh->nlmsg_type; - msg_ptr->link_event = true; - if(IPACM_SUCCESS != ipa_nl_decode_rtm_link(buffer, buflen, &(msg_ptr->nl_link_info))) - { - IPACMERR("Failed to decode rtm link message\n"); - return IPACM_FAILURE; - } - else - { - IPACMDBG("Got RTM_NEWLINK with below values\n"); - IPACMDBG("RTM_NEWLINK, ifi_change:%d\n", msg_ptr->nl_link_info.metainfo.ifi_change); - IPACMDBG("RTM_NEWLINK, ifi_flags:%d\n", msg_ptr->nl_link_info.metainfo.ifi_flags); - IPACMDBG("RTM_NEWLINK, ifi_index:%d\n", msg_ptr->nl_link_info.metainfo.ifi_index); - IPACMDBG("RTM_NEWLINK, family:%d\n", msg_ptr->nl_link_info.metainfo.ifi_family); - /* RTM_NEWLINK event with AF_BRIDGE family should be ignored in Android - but this should be processed in case of MDM for Ehernet interface. - */ -#ifdef FEATURE_IPA_ANDROID - if (msg_ptr->nl_link_info.metainfo.ifi_family == AF_BRIDGE) - { - IPACMERR(" ignore this RTM_NEWLINK msg \n"); - return IPACM_SUCCESS; - } -#endif - if(IFF_UP & msg_ptr->nl_link_info.metainfo.ifi_change) - { - IPACMDBG("GOT useful newlink event\n"); - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return IPACM_FAILURE; - } - data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index; - - if(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_UP) - { - IPACMDBG_H("Interface %s bring up with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family); - /* post link up to command queue */ - evt_data.event = IPA_LINK_UP_EVENT; - IPACMDBG_H("Posting IPA_LINK_UP_EVENT with if index: %d\n", - msg_ptr->nl_link_info.metainfo.ifi_index); - } - else - { - IPACMDBG_H("Interface %s bring down with IP-family: %d \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_family); - /* post link down to command queue */ - evt_data.event = IPA_LINK_DOWN_EVENT; - IPACMDBG_H("Posting IPA_LINK_DOWN_EVENT with if index: %d\n", - data_fid->if_index); - } - evt_data.evt_data = data_fid; - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - - /* Add IPACM support for ECM plug-in/plug_out */ - /*-------------------------------------------------------------------------- - Check if the interface is running.If its a RTM_NEWLINK and the interface - is running then it means that its a link up event - ---------------------------------------------------------------------------*/ - if((msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_RUNNING) && - (msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP)) - { - - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return IPACM_FAILURE; - } - data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index; - - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - IPACMDBG("Got a usb link_up event (Interface %s, %d) \n", dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); - - /*-------------------------------------------------------------------------- - Post LAN iface (ECM) link up event - ---------------------------------------------------------------------------*/ - evt_data.event = IPA_USB_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - IPACM_EvtDispatcher::PostEvt(&evt_data); - IPACMDBG_H("Posting usb IPA_LINK_UP_EVENT with if index: %d\n", - data_fid->if_index); - } - else if(!(msg_ptr->nl_link_info.metainfo.ifi_flags & IFF_LOWER_UP)) - { - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return IPACM_FAILURE; - } - data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index; - - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - IPACMDBG_H("Got a usb link_down event (Interface %s) \n", dev_name); - - /*-------------------------------------------------------------------------- - Post LAN iface (ECM) link down event - ---------------------------------------------------------------------------*/ - evt_data.event = IPA_LINK_DOWN_EVENT; - evt_data.evt_data = data_fid; - IPACM_EvtDispatcher::PostEvt(&evt_data); - IPACMDBG_H("Posting usb IPA_LINK_DOWN_EVENT with if index: %d\n", - data_fid->if_index); - } - } - break; - - case RTM_DELLINK: - IPACMDBG("\n GOT dellink event\n"); - msg_ptr->type = nlh->nlmsg_type; - msg_ptr->link_event = true; - IPACMDBG("entering rtm decode\n"); - if(IPACM_SUCCESS != ipa_nl_decode_rtm_link(buffer, buflen, &(msg_ptr->nl_link_info))) - { - IPACMERR("Failed to decode rtm link message\n"); - return IPACM_FAILURE; - } - else - { - IPACMDBG("Got RTM_DELLINK with below values\n"); - IPACMDBG("RTM_DELLINK, ifi_change:%d\n", msg_ptr->nl_link_info.metainfo.ifi_change); - IPACMDBG("RTM_DELLINK, ifi_flags:%d\n", msg_ptr->nl_link_info.metainfo.ifi_flags); - IPACMDBG("RTM_DELLINK, ifi_index:%d\n", msg_ptr->nl_link_info.metainfo.ifi_index); - IPACMDBG("RTM_DELLINK, family:%d\n", msg_ptr->nl_link_info.metainfo.ifi_family); - /* RTM_NEWLINK event with AF_BRIDGE family should be ignored in Android - but this should be processed in case of MDM for Ehernet interface. - */ -#ifdef FEATURE_IPA_ANDROID - if (msg_ptr->nl_link_info.metainfo.ifi_family == AF_BRIDGE) - { - IPACMERR(" ignore this RTM_DELLINK msg \n"); - return IPACM_SUCCESS; - } -#endif - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_link_info.metainfo.ifi_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - IPACMDBG("Interface %s bring down \n", dev_name); - - /* post link down to command queue */ - evt_data.event = IPA_LINK_DOWN_EVENT; - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for event data_fid\n"); - return IPACM_FAILURE; - } - - data_fid->if_index = msg_ptr->nl_link_info.metainfo.ifi_index; - - IPACMDBG_H("posting IPA_LINK_DOWN_EVENT with if idnex:%d\n", - data_fid->if_index); - evt_data.evt_data = data_fid; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - break; - - case RTM_NEWADDR: - IPACMDBG("\n GOT RTM_NEWADDR event\n"); - if(IPACM_SUCCESS != ipa_nl_decode_rtm_addr(buffer, buflen, &(msg_ptr->nl_addr_info))) - { - IPACMERR("Failed to decode rtm addr message\n"); - return IPACM_FAILURE; - } - else - { - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_addr_info.metainfo.ifa_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - } - IPACMDBG("Interface %s \n", dev_name); - - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - if(AF_INET6 == msg_ptr->nl_addr_info.attr_info.prefix_addr.ss_family) - { - data_addr->iptype = IPA_IP_v6; - IPACM_NL_REPORT_ADDR( "IFA_ADDRESS:", msg_ptr->nl_addr_info.attr_info.prefix_addr ); - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_addr_info.attr_info.prefix_addr); - data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]); - } - else - { - data_addr->iptype = IPA_IP_v4; - IPACM_NL_REPORT_ADDR( "IFA_ADDRESS:", msg_ptr->nl_addr_info.attr_info.prefix_addr ); - IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr, msg_ptr->nl_addr_info.attr_info.prefix_addr); - data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr); - - } - - evt_data.event = IPA_ADDR_ADD_EVENT; - data_addr->if_index = msg_ptr->nl_addr_info.metainfo.ifa_index; - if(AF_INET6 == msg_ptr->nl_addr_info.attr_info.prefix_addr.ss_family) - { - IPACMDBG("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv6 addr:0x%x:%x:%x:%x\n", - data_addr->if_index, - data_addr->ipv6_addr[0], - data_addr->ipv6_addr[1], - data_addr->ipv6_addr[2], - data_addr->ipv6_addr[3]); - } - else - { - IPACMDBG("Posting IPA_ADDR_ADD_EVENT with if index:%d, ipv4 addr:0x%x\n", - data_addr->if_index, - data_addr->ipv4_addr); - } - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - break; - - case RTM_NEWROUTE: - - if(IPACM_SUCCESS != ipa_nl_decode_rtm_route(buffer, buflen, &(msg_ptr->nl_route_info))) - { - IPACMERR("Failed to decode rtm route message\n"); - return IPACM_FAILURE; - } - - IPACMDBG("In case RTM_NEWROUTE\n"); - IPACMDBG("rtm_type: %d\n", msg_ptr->nl_route_info.metainfo.rtm_type); - IPACMDBG("protocol: %d\n", msg_ptr->nl_route_info.metainfo.rtm_protocol); - IPACMDBG("rtm_scope: %d\n", msg_ptr->nl_route_info.metainfo.rtm_scope); - IPACMDBG("rtm_table: %d\n", msg_ptr->nl_route_info.metainfo.rtm_table); - IPACMDBG("rtm_family: %d\n", msg_ptr->nl_route_info.metainfo.rtm_family); - IPACMDBG("param_mask: 0x%x\n", msg_ptr->nl_route_info.attr_info.param_mask); - - /* take care of route add default route & uniroute */ - if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && - ((msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) || - (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_RA)) && - (msg_ptr->nl_route_info.metainfo.rtm_scope == RT_SCOPE_UNIVERSE) && - (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN)) - { - IPACMDBG("\n GOT RTM_NEWROUTE event\n"); - - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST) - { - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - - IPACM_NL_REPORT_ADDR( "route add -host", msg_ptr->nl_route_info.attr_info.dst_addr ); - IPACM_NL_REPORT_ADDR( "gw", msg_ptr->nl_route_info.attr_info.gateway_addr ); - IPACMDBG("dev %s\n",dev_name ); - /* insert to command queue */ - IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - temp = (-1); - - evt_data.event = IPA_ROUTE_ADD_EVENT; - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v4; - data_addr->ipv4_addr = ntohl(if_ipv4_addr); - data_addr->ipv4_addr_mask = ntohl(if_ipipv4_addr_mask); - - IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv4 address 0x%x, mask:0x%x\n", - data_addr->if_index, - data_addr->ipv4_addr, - data_addr->ipv4_addr_mask); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - - } - else - { - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - - if(AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) - { - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_PRIORITY) - { - IPACMDBG_H("ip -6 route add default dev %s metric %d\n", - dev_name, - msg_ptr->nl_route_info.attr_info.priority); - } - else - { - IPACMDBG_H("ip -6 route add default dev %s\n", dev_name); - } - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]); - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr); - data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]); - data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]); - data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]); - data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_gw, msg_ptr->nl_route_info.attr_info.gateway_addr); - data_addr->ipv6_addr_gw[0] = ntohl(data_addr->ipv6_addr_gw[0]); - data_addr->ipv6_addr_gw[1] = ntohl(data_addr->ipv6_addr_gw[1]); - data_addr->ipv6_addr_gw[2] = ntohl(data_addr->ipv6_addr_gw[2]); - data_addr->ipv6_addr_gw[3] = ntohl(data_addr->ipv6_addr_gw[3]); - IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_route_info.attr_info.gateway_addr); - - evt_data.event = IPA_ROUTE_ADD_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v6; - - IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 address\n", - data_addr->if_index); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - - } - else - { - IPACM_NL_REPORT_ADDR( "route add default gw \n", msg_ptr->nl_route_info.attr_info.gateway_addr ); - IPACMDBG_H("dev %s \n", dev_name); - IPACM_NL_REPORT_ADDR( "dstIP:", msg_ptr->nl_route_info.attr_info.dst_addr ); - - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - IPACM_EVENT_COPY_ADDR_v4( if_ipipv4_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr); - IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr_gw, msg_ptr->nl_route_info.attr_info.gateway_addr); - - evt_data.event = IPA_ROUTE_ADD_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v4; - data_addr->ipv4_addr = ntohl(if_ipv4_addr); - data_addr->ipv4_addr_gw = ntohl(if_ipv4_addr_gw); - data_addr->ipv4_addr_mask = ntohl(if_ipipv4_addr_mask); - - IPACMDBG_H("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv4 addr:0x%x, mask: 0x%x and gw: 0x%x\n", - data_addr->if_index, - data_addr->ipv4_addr, - data_addr->ipv4_addr_mask, - data_addr->ipv4_addr_gw); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - } - } - - /* ipv6 routing table */ - if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) && - (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && - (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) && - (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN)) - { - IPACMDBG("\n GOT valid v6-RTM_NEWROUTE event\n"); - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST) - { - IPACM_NL_REPORT_ADDR( "Route ADD DST:", msg_ptr->nl_route_info.attr_info.dst_addr ); - IPACMDBG("%d, metric %d, dev %s\n", - msg_ptr->nl_route_info.metainfo.rtm_dst_len, - msg_ptr->nl_route_info.attr_info.priority, - dev_name); - - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - - data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]); - - mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len; - for(mask_index = 0; mask_index < 4; mask_index++) - { - if(mask_value_v6 >= 32) - { - mask_v6(32, &data_addr->ipv6_addr_mask[mask_index]); - mask_value_v6 -= 32; - } - else - { - mask_v6(mask_value_v6, &data_addr->ipv6_addr_mask[mask_index]); - mask_value_v6 = 0; - } - } - - IPACMDBG("ADD IPV6 MASK %d: %08x:%08x:%08x:%08x \n", - msg_ptr->nl_route_info.metainfo.rtm_dst_len, - data_addr->ipv6_addr_mask[0], - data_addr->ipv6_addr_mask[1], - data_addr->ipv6_addr_mask[2], - data_addr->ipv6_addr_mask[3]); - - data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]); - data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]); - data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]); - data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); - - evt_data.event = IPA_ROUTE_ADD_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v6; - - IPACMDBG("Posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 addr\n", - data_addr->if_index); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_GATEWAY) - { - IPACM_NL_REPORT_ADDR( "Route ADD ::/0 Next Hop:", msg_ptr->nl_route_info.attr_info.gateway_addr ); - IPACMDBG(" metric %d, dev %s\n", - msg_ptr->nl_route_info.attr_info.priority, - dev_name); - - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - - data_addr->ipv6_addr[0]=ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1]=ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2]=ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3]=ntohl(data_addr->ipv6_addr[3]); - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr); - - data_addr->ipv6_addr_mask[0]=ntohl(data_addr->ipv6_addr_mask[0]); - data_addr->ipv6_addr_mask[1]=ntohl(data_addr->ipv6_addr_mask[1]); - data_addr->ipv6_addr_mask[2]=ntohl(data_addr->ipv6_addr_mask[2]); - data_addr->ipv6_addr_mask[3]=ntohl(data_addr->ipv6_addr_mask[3]); - - evt_data.event = IPA_ROUTE_ADD_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v6; - - IPACMDBG("posting IPA_ROUTE_ADD_EVENT with if index:%d, ipv6 address\n", - data_addr->if_index); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - } - break; - - case RTM_DELROUTE: - if(IPACM_SUCCESS != ipa_nl_decode_rtm_route(buffer, buflen, &(msg_ptr->nl_route_info))) - { - IPACMERR("Failed to decode rtm route message\n"); - return IPACM_FAILURE; - } - /* take care of route delete of default route & uniroute */ - if((msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && - ((msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_BOOT) || - (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_RA)) && - (msg_ptr->nl_route_info.metainfo.rtm_scope == 0) && - (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN)) - { - - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST) - { - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - IPACM_NL_REPORT_ADDR( "route del -host ", msg_ptr->nl_route_info.attr_info.dst_addr); - IPACM_NL_REPORT_ADDR( " gw ", msg_ptr->nl_route_info.attr_info.gateway_addr); - IPACMDBG("dev %s\n", dev_name); - - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - IPACM_EVENT_COPY_ADDR_v4( if_ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - temp = (-1); - if_ipipv4_addr_mask = ntohl(temp); - - evt_data.event = IPA_ROUTE_DEL_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v4; - data_addr->ipv4_addr = ntohl(if_ipv4_addr); - data_addr->ipv4_addr_mask = ntohl(if_ipipv4_addr_mask); - - IPACMDBG_H("Posting event IPA_ROUTE_DEL_EVENT with if index:%d, ipv4 address 0x%x, mask:0x%x\n", - data_addr->if_index, - data_addr->ipv4_addr, - data_addr->ipv4_addr_mask); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - else - { - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name\n"); - return IPACM_FAILURE; - } - - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - if(AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) - { - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_PRIORITY) - { - IPACMDBG("ip -6 route del default dev %s metric %d\n", - dev_name, - msg_ptr->nl_route_info.attr_info.priority); - } - else - { - IPACMDBG("ip -6 route del default dev %s\n", dev_name); - } - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]); - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr); - data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]); - data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]); - data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]); - data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr_gw, msg_ptr->nl_route_info.attr_info.gateway_addr); - data_addr->ipv6_addr_gw[0] = ntohl(data_addr->ipv6_addr_gw[0]); - data_addr->ipv6_addr_gw[1] = ntohl(data_addr->ipv6_addr_gw[1]); - data_addr->ipv6_addr_gw[2] = ntohl(data_addr->ipv6_addr_gw[2]); - data_addr->ipv6_addr_gw[3] = ntohl(data_addr->ipv6_addr_gw[3]); - IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_route_info.attr_info.gateway_addr); - data_addr->iptype = IPA_IP_v6; - } - else - { - IPACM_NL_REPORT_ADDR( "route del default gw", msg_ptr->nl_route_info.attr_info.gateway_addr); - IPACMDBG("dev %s\n", dev_name); - - IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - data_addr->ipv4_addr = ntohl(data_addr->ipv4_addr); - - IPACM_EVENT_COPY_ADDR_v4( data_addr->ipv4_addr_mask, msg_ptr->nl_route_info.attr_info.dst_addr); - data_addr->ipv4_addr_mask = ntohl(data_addr->ipv4_addr_mask); - - data_addr->iptype = IPA_IP_v4; - } - - evt_data.event = IPA_ROUTE_DEL_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - - IPACMDBG_H("Posting IPA_ROUTE_DEL_EVENT with if index:%d\n", - data_addr->if_index); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - } - - /* ipv6 routing table */ - if((AF_INET6 == msg_ptr->nl_route_info.metainfo.rtm_family) && - (msg_ptr->nl_route_info.metainfo.rtm_type == RTN_UNICAST) && - (msg_ptr->nl_route_info.metainfo.rtm_protocol == RTPROT_KERNEL) && - (msg_ptr->nl_route_info.metainfo.rtm_table == RT_TABLE_MAIN)) - { - IPACMDBG("\n GOT valid v6-RTM_DELROUTE event\n"); - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_route_info.attr_info.oif_index); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface name"); - return IPACM_FAILURE; - } - - if(msg_ptr->nl_route_info.attr_info.param_mask & IPA_RTA_PARAM_DST) - { - IPACM_NL_REPORT_ADDR( "DEL", msg_ptr->nl_route_info.attr_info.dst_addr); - IPACMDBG("/%d, metric %d, dev %s\n", - msg_ptr->nl_route_info.metainfo.rtm_dst_len, - msg_ptr->nl_route_info.attr_info.priority, - dev_name); - - /* insert to command queue */ - data_addr = (ipacm_event_data_addr *)malloc(sizeof(ipacm_event_data_addr)); - if(data_addr == NULL) - { - IPACMERR("unable to allocate memory for event data_addr\n"); - return IPACM_FAILURE; - } - - IPACM_EVENT_COPY_ADDR_v6( data_addr->ipv6_addr, msg_ptr->nl_route_info.attr_info.dst_addr); - - data_addr->ipv6_addr[0] = ntohl(data_addr->ipv6_addr[0]); - data_addr->ipv6_addr[1] = ntohl(data_addr->ipv6_addr[1]); - data_addr->ipv6_addr[2] = ntohl(data_addr->ipv6_addr[2]); - data_addr->ipv6_addr[3] = ntohl(data_addr->ipv6_addr[3]); - - mask_value_v6 = msg_ptr->nl_route_info.metainfo.rtm_dst_len; - for(mask_index = 0; mask_index < 4; mask_index++) - { - IPACMDBG("%dst %d \n", - mask_index, - mask_value_v6); - if(mask_value_v6 >= 32) - { - mask_v6(32, &data_addr->ipv6_addr_mask[mask_index]); - mask_value_v6 -= 32; - IPACMDBG("%dst: %08x \n", - mask_index, - data_addr->ipv6_addr_mask[mask_index]); - } - else - { - mask_v6(mask_value_v6, data_addr->ipv6_addr_mask); - mask_value_v6 = 0; - IPACMDBG("%dst: %08x \n", - mask_index, - data_addr->ipv6_addr_mask[mask_index]); - } - } - - IPACMDBG("DEL IPV6 MASK 0st: %08x ", - data_addr->ipv6_addr_mask[0]); - IPACMDBG("1st: %08x ", - data_addr->ipv6_addr_mask[1]); - IPACMDBG("2st: %08x ", - data_addr->ipv6_addr_mask[2]); - IPACMDBG("3st: %08x \n", - data_addr->ipv6_addr_mask[3]); - - data_addr->ipv6_addr_mask[0] = ntohl(data_addr->ipv6_addr_mask[0]); - data_addr->ipv6_addr_mask[1] = ntohl(data_addr->ipv6_addr_mask[1]); - data_addr->ipv6_addr_mask[2] = ntohl(data_addr->ipv6_addr_mask[2]); - data_addr->ipv6_addr_mask[3] = ntohl(data_addr->ipv6_addr_mask[3]); - - evt_data.event = IPA_ROUTE_DEL_EVENT; - data_addr->if_index = msg_ptr->nl_route_info.attr_info.oif_index; - data_addr->iptype = IPA_IP_v6; - - IPACMDBG_H("posting event IPA_ROUTE_DEL_EVENT with if index:%d, ipv4 address\n", - data_addr->if_index); - evt_data.evt_data = data_addr; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - } - } - break; - - case RTM_NEWNEIGH: - if(IPACM_SUCCESS != ipa_nl_decode_rtm_neigh(buffer, buflen, &(msg_ptr->nl_neigh_info))) - { - IPACMERR("Failed to decode rtm neighbor message\n"); - return IPACM_FAILURE; - } - - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_neigh_info.metainfo.ndm_ifindex); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface index\n"); - return IPACM_FAILURE; - } - else - { - IPACMDBG("\n GOT RTM_NEWNEIGH event (%s) ip %d\n",dev_name,msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family); - } - - /* insert to command queue */ - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if(data_all == NULL) - { - IPACMERR("unable to allocate memory for event data_all\n"); - return IPACM_FAILURE; - } - - memset(data_all, 0, sizeof(ipacm_event_data_all)); - if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6) - { - IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr); - IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr); - - data_all->ipv6_addr[0]=ntohl(data_all->ipv6_addr[0]); - data_all->ipv6_addr[1]=ntohl(data_all->ipv6_addr[1]); - data_all->ipv6_addr[2]=ntohl(data_all->ipv6_addr[2]); - data_all->ipv6_addr[3]=ntohl(data_all->ipv6_addr[3]); - data_all->iptype = IPA_IP_v6; - } - else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET) - { - IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr); - IPACM_EVENT_COPY_ADDR_v4( data_all->ipv4_addr, msg_ptr->nl_neigh_info.attr_info.local_addr); - data_all->ipv4_addr = ntohl(data_all->ipv4_addr); - data_all->iptype = IPA_IP_v4; - } - else - { - data_all->iptype = IPA_IP_v6; - } - - IPACMDBG("NDA_LLADDR:MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[0], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[1], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[2], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[3], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[4], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[5]); - - - memcpy(data_all->mac_addr, - msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data, - sizeof(data_all->mac_addr)); - data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex; - /* Add support to replace src-mac as bridge0 mac */ - if((msg_ptr->nl_neigh_info.metainfo.ndm_family == AF_BRIDGE) && - (msg_ptr->nl_neigh_info.metainfo.ndm_state == NUD_PERMANENT)) - { - /* Posting IPA_BRIDGE_LINK_UP_EVENT event */ - evt_data.event = IPA_BRIDGE_LINK_UP_EVENT; - IPACMDBG_H("posting IPA_BRIDGE_LINK_UP_EVENT (%s):index:%d \n", - dev_name, - data_all->if_index); - } - else - { - /* Posting new_neigh events for all LAN/WAN clients */ - evt_data.event = IPA_NEW_NEIGH_EVENT; - IPACMDBG_H("posting IPA_NEW_NEIGH_EVENT (%s):index:%d ip-family: %d\n", - dev_name, - data_all->if_index, - msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family); - } - evt_data.evt_data = data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - break; - - case RTM_DELNEIGH: - if(IPACM_SUCCESS != ipa_nl_decode_rtm_neigh(buffer, buflen, &(msg_ptr->nl_neigh_info))) - { - IPACMERR("Failed to decode rtm neighbor message\n"); - return IPACM_FAILURE; - } - - ret_val = ipa_get_if_name(dev_name, msg_ptr->nl_neigh_info.metainfo.ndm_ifindex); - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Error while getting interface index\n"); - return IPACM_FAILURE; - } - else - { - IPACMDBG("\n GOT RTM_DELNEIGH event (%s) ip %d\n",dev_name,msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family); - } - - /* insert to command queue */ - data_all = (ipacm_event_data_all *)malloc(sizeof(ipacm_event_data_all)); - if(data_all == NULL) - { - IPACMERR("unable to allocate memory for event data_all\n"); - return IPACM_FAILURE; - } - - memset(data_all, 0, sizeof(ipacm_event_data_all)); - if(msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET6) - { - IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr); - IPACM_EVENT_COPY_ADDR_v6( data_all->ipv6_addr, msg_ptr->nl_neigh_info.attr_info.local_addr); - - data_all->ipv6_addr[0] = ntohl(data_all->ipv6_addr[0]); - data_all->ipv6_addr[1] = ntohl(data_all->ipv6_addr[1]); - data_all->ipv6_addr[2] = ntohl(data_all->ipv6_addr[2]); - data_all->ipv6_addr[3] = ntohl(data_all->ipv6_addr[3]); - data_all->iptype = IPA_IP_v6; - } - else if (msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family == AF_INET) - { - IPACM_NL_REPORT_ADDR( " ", msg_ptr->nl_neigh_info.attr_info.local_addr); - IPACM_EVENT_COPY_ADDR_v4( data_all->ipv4_addr, msg_ptr->nl_neigh_info.attr_info.local_addr); - data_all->ipv4_addr = ntohl(data_all->ipv4_addr); - data_all->iptype = IPA_IP_v4; - } - else - { - data_all->iptype = IPA_IP_v6; - } - - IPACMDBG("NDA_LLADDR:MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[0], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[1], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[2], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[3], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[4], - (unsigned char)(msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr).sa_data[5]); - - memcpy(data_all->mac_addr, - msg_ptr->nl_neigh_info.attr_info.lladdr_hwaddr.sa_data, - sizeof(data_all->mac_addr)); - evt_data.event = IPA_DEL_NEIGH_EVENT; - data_all->if_index = msg_ptr->nl_neigh_info.metainfo.ndm_ifindex; - - IPACMDBG_H("posting IPA_DEL_NEIGH_EVENT (%s):index:%d ip-family: %d\n", - dev_name, - data_all->if_index, - msg_ptr->nl_neigh_info.attr_info.local_addr.ss_family); - evt_data.evt_data = data_all; - IPACM_EvtDispatcher::PostEvt(&evt_data); - /* finish command queue */ - break; - - default: - IPACMDBG(" ignore NL event %d!!!\n ", nlh->nlmsg_type); - break; - - } - nlh = NLMSG_NEXT(nlh, buflen); - } - - return IPACM_SUCCESS; -} - - -/* Virtual function registered to receive incoming messages over the NETLINK routing socket*/ -int ipa_nl_recv_msg(int fd) -{ - struct msghdr *msghdr = NULL; - struct iovec *iov = NULL; - unsigned int msglen = 0; - ipa_nl_msg_t *nlmsg = NULL; - - nlmsg = (ipa_nl_msg_t *)malloc(sizeof(ipa_nl_msg_t)); - if(NULL == nlmsg) - { - IPACMERR("Failed alloc of nlmsg \n"); - goto error; - } - else - { - if(IPACM_SUCCESS != ipa_nl_recv(fd, &msghdr, &msglen)) - { - IPACMERR("Failed to receive nl message \n"); - goto error; - } - - if(msghdr== NULL) - { - IPACMERR(" failed to get msghdr\n"); - goto error; - } - - iov = msghdr->msg_iov; - - memset(nlmsg, 0, sizeof(ipa_nl_msg_t)); - if(IPACM_SUCCESS != ipa_nl_decode_nlmsg((char *)iov->iov_base, msglen, nlmsg)) - { - IPACMERR("Failed to decode nl message \n"); - goto error; - } - /* Release NetLink message buffer */ - if(msghdr) - { - ipa_nl_release_msg(msghdr); - } - if(nlmsg) - { - free(nlmsg); - } - } - - return IPACM_SUCCESS; - -error: - if(msghdr) - { - ipa_nl_release_msg(msghdr); - } - if(nlmsg) - { - free(nlmsg); - } - - return IPACM_FAILURE; -} - -/* get ipa interface name */ -int ipa_get_if_name -( - char *if_name, - int if_index - ) -{ - int fd; - struct ifreq ifr; - - if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) - { - IPACMERR("get interface name socket create failed \n"); - return IPACM_FAILURE; - } - - memset(&ifr, 0, sizeof(struct ifreq)); - ifr.ifr_ifindex = if_index; - IPACMDBG("Interface index %d\n", if_index); - - if(ioctl(fd, SIOCGIFNAME, &ifr) < 0) - { - IPACMERR("call_ioctl_on_dev: ioctl failed:\n"); - close(fd); - return IPACM_FAILURE; - } - - (void)strncpy(if_name, ifr.ifr_name, sizeof(ifr.ifr_name)); - IPACMDBG("interface name %s\n", ifr.ifr_name); - close(fd); - - return IPACM_SUCCESS; -} - -/* Initialization routine for listener on NetLink sockets interface */ -int ipa_nl_listener_init -( - unsigned int nl_type, - unsigned int nl_groups, - ipa_nl_sk_fd_set_info_t *sk_fdset, - ipa_sock_thrd_fd_read_f read_f - ) -{ - ipa_nl_sk_info_t sk_info; - int ret_val; - - memset(&sk_info, 0, sizeof(ipa_nl_sk_info_t)); - IPACMDBG_H("Entering IPA NL listener init\n"); - - if(ipa_nl_open_socket(&sk_info, nl_type, nl_groups) == IPACM_SUCCESS) - { - IPACMDBG_H("IPA Open netlink socket succeeds\n"); - } - else - { - IPACMERR("Netlink socket open failed\n"); - return IPACM_FAILURE; - } - - /* Add NETLINK socket to the list of sockets that the listener - thread should listen on. */ - - if(ipa_nl_addfd_map(sk_fdset, sk_info.sk_fd, read_f) != IPACM_SUCCESS) - { - IPACMERR("cannot add nl routing sock for reading\n"); - close(sk_info.sk_fd); - return IPACM_FAILURE; - } - - /* Start the socket listener thread */ - ret_val = ipa_nl_sock_listener_start(sk_fdset); - - if(ret_val != IPACM_SUCCESS) - { - IPACMERR("Failed to start NL listener\n"); - } - - return IPACM_SUCCESS; -} - -/* find the newroute subnet mask */ -int find_mask(int ip_v4_last, int *mask_value) -{ - - switch(ip_v4_last) - { - - case 3: - *mask_value = 252; - return IPACM_SUCCESS; - break; - - case 7: - *mask_value = 248; - return IPACM_SUCCESS; - break; - - case 15: - *mask_value = 240; - return IPACM_SUCCESS; - break; - - case 31: - *mask_value = 224; - return IPACM_SUCCESS; - break; - - case 63: - *mask_value = 192; - return IPACM_SUCCESS; - break; - - case 127: - *mask_value = 128; - return IPACM_SUCCESS; - break; - - case 255: - *mask_value = 0; - return IPACM_SUCCESS; - break; - - default: - return IPACM_FAILURE; - break; - - } -} - -/* map mask value for ipv6 */ -int mask_v6(int index, uint32_t *mask) -{ - switch(index) - { - - case 0: - *mask = 0x00000000; - return IPACM_SUCCESS; - break; - case 4: - *mask = 0xf0000000; - return IPACM_SUCCESS; - break; - case 8: - *mask = 0xff000000; - return IPACM_SUCCESS; - break; - case 12: - *mask = 0xfff00000; - return IPACM_SUCCESS; - break; - case 16: - *mask = 0xffff0000; - return IPACM_SUCCESS; - break; - case 20: - *mask = 0xfffff000; - return IPACM_SUCCESS; - break; - case 24: - *mask = 0xffffff00; - return IPACM_SUCCESS; - break; - case 28: - *mask = 0xfffffff0; - return IPACM_SUCCESS; - break; - case 32: - *mask = 0xffffffff; - return IPACM_SUCCESS; - break; - default: - return IPACM_FAILURE; - break; - - } -} - - diff --git a/ipacm/src/IPACM_Routing.cpp b/ipacm/src/IPACM_Routing.cpp deleted file mode 100644 index 2a2555a..0000000 --- a/ipacm/src/IPACM_Routing.cpp +++ /dev/null @@ -1,276 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Routing.cpp - - @brief - This file implements the IPACM routing functionality. - - @Author - -*/ - -#include <unistd.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> - -#include "IPACM_Routing.h" -#include <IPACM_Log.h> - -const char *IPACM_Routing::DEVICE_NAME = "/dev/ipa"; - -IPACM_Routing::IPACM_Routing() -{ - m_fd = open(DEVICE_NAME, O_RDWR); - if (0 == m_fd) - { - IPACMERR("Failed opening %s.\n", DEVICE_NAME); - } -} - -IPACM_Routing::~IPACM_Routing() -{ - close(m_fd); -} - -bool IPACM_Routing::DeviceNodeIsOpened() -{ - int res = fcntl(m_fd, F_GETFL); - - if (m_fd > 0 && res >= 0) return true; - else return false; - -} - -bool IPACM_Routing::AddRoutingRule(struct ipa_ioc_add_rt_rule *ruleTable) -{ - int retval = 0, cnt=0; - bool isInvalid = false; - - if (!DeviceNodeIsOpened()) - { - IPACMERR("Device is not opened\n"); - return false; - } - - for(cnt=0; cnt<ruleTable->num_rules; cnt++) - { - if(ruleTable->rules[cnt].rule.dst > IPA_CLIENT_MAX) - { - IPACMERR("Invalid dst pipe, Rule:%d dst_pipe:%d\n", cnt, ruleTable->rules[cnt].rule.dst); - isInvalid = true; - } - } - - if(isInvalid) - { - return false; - } - - retval = ioctl(m_fd, IPA_IOC_ADD_RT_RULE, ruleTable); - if (retval) - { - IPACMERR("Failed adding routing rule %p\n", ruleTable); - return false; - } - - for(cnt=0; cnt<ruleTable->num_rules; cnt++) - { - IPACMDBG("Rule:%d dst_pipe:%d\n", cnt, ruleTable->rules[cnt].rule.dst); - } - - IPACMDBG_H("Added routing rule %p\n", ruleTable); - return true; -} - -bool IPACM_Routing::DeleteRoutingRule(struct ipa_ioc_del_rt_rule *ruleTable) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_DEL_RT_RULE, ruleTable); - if (retval) - { - IPACMERR("Failed deleting routing rule table %p\n", ruleTable); - return false; - } - - IPACMDBG_H("Deleted routing rule %p\n", ruleTable); - return true; -} - -bool IPACM_Routing::Commit(enum ipa_ip_type ip) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_COMMIT_RT, ip); - if (retval) - { - IPACMERR("Failed commiting routing rules.\n"); - return false; - } - - IPACMDBG_H("Commited routing rules to IPA HW.\n"); - return true; -} - -bool IPACM_Routing::Reset(enum ipa_ip_type ip) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_RESET_RT, ip); - retval |= ioctl(m_fd, IPA_IOC_COMMIT_RT, ip); - if (retval) - { - IPACMERR("Failed resetting routing block.\n"); - return false; - } - - IPACMDBG_H("Reset command issued to IPA routing block.\n"); - return true; -} - -bool IPACM_Routing::GetRoutingTable(struct ipa_ioc_get_rt_tbl *routingTable) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_GET_RT_TBL, routingTable); - if (retval) - { - IPACMERR("IPA_IOCTL_GET_RT_TBL ioctl failed, routingTable =0x%p, retval=0x%x.\n", routingTable, retval); - return false; - } - IPACMDBG_H("IPA_IOCTL_GET_RT_TBL ioctl issued to IPA routing block.\n"); - /* put routing table right after successfully get routing table */ - PutRoutingTable(routingTable->hdl); - - return true; -} - -bool IPACM_Routing::PutRoutingTable(uint32_t routingTableHandle) -{ - int retval = 0; - - if (!DeviceNodeIsOpened()) return false; - - retval = ioctl(m_fd, IPA_IOC_PUT_RT_TBL, routingTableHandle); - if (retval) - { - IPACMERR("IPA_IOCTL_PUT_RT_TBL ioctl failed.\n"); - return false; - } - - IPACMDBG_H("IPA_IOCTL_PUT_RT_TBL ioctl issued to IPA routing block.\n"); - return true; -} - -bool IPACM_Routing::DeleteRoutingHdl(uint32_t rt_rule_hdl, ipa_ip_type ip) -{ - const uint8_t NUM_RULES = 1; - struct ipa_ioc_del_rt_rule *rt_rule; - struct ipa_rt_rule_del *rt_rule_entry; - bool res = true; - int len = 0; - - if (rt_rule_hdl == 0) - { - IPACMERR(" No route handle passed. Ignoring it\n"); - return res; - } - - len = (sizeof(struct ipa_ioc_del_rt_rule)) + (NUM_RULES * sizeof(struct ipa_rt_rule_del)); - rt_rule = (struct ipa_ioc_del_rt_rule *)malloc(len); - if (rt_rule == NULL) - { - IPACMERR("unable to allocate memory for del route rule\n"); - return false; - } - - memset(rt_rule, 0, len); - rt_rule->commit = 1; - rt_rule->num_hdls = NUM_RULES; - rt_rule->ip = ip; - - rt_rule_entry = &rt_rule->hdl[0]; - rt_rule_entry->status = -1; - rt_rule_entry->hdl = rt_rule_hdl; - - IPACMDBG_H("Deleting Route hdl:(0x%x) with ip type: %d\n", rt_rule_entry->hdl, ip); - if ((false == DeleteRoutingRule(rt_rule)) || - (rt_rule_entry->status)) - { - PERROR("Routing rule deletion failed!\n"); - goto fail; - res = false; - } - -fail: - free(rt_rule); - - return res; -} - -bool IPACM_Routing::ModifyRoutingRule(struct ipa_ioc_mdfy_rt_rule *mdfyRules) -{ - int retval = 0, cnt; - - if (!DeviceNodeIsOpened()) - { - IPACMERR("Device is not opened\n"); - return false; - } - - retval = ioctl(m_fd, IPA_IOC_MDFY_RT_RULE, mdfyRules); - if (retval) - { - IPACMERR("Failed modifying routing rules %p\n", mdfyRules); - return false; - } - - for(cnt=0; cnt<mdfyRules->num_rules; cnt++) - { - if(mdfyRules->rules[cnt].status != 0) - { - IPACMERR("Unable to modify rule: %d\n", cnt); - } - } - - IPACMDBG_H("Modified routing rules %p\n", mdfyRules); - return true; -} diff --git a/ipacm/src/IPACM_Wan.cpp b/ipacm/src/IPACM_Wan.cpp deleted file mode 100644 index 1a7eae1..0000000 --- a/ipacm/src/IPACM_Wan.cpp +++ /dev/null @@ -1,6171 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Wan.cpp - - @brief - This file implements the WAN iface functionality. - - @Author - Skylar Chang - -*/ -#include <string.h> -#include <fcntl.h> -#include <sys/ioctl.h> -#include <IPACM_Wan.h> -#include <IPACM_Xml.h> -#include <IPACM_Log.h> -#include "IPACM_EvtDispatcher.h" -#include <IPACM_IfaceManager.h> -#include "linux/rmnet_ipa_fd_ioctl.h" -#include "IPACM_Config.h" -#include "IPACM_Defs.h" -#include <IPACM_ConntrackListener.h> -#include "linux/ipa_qmi_service_v01.h" - -bool IPACM_Wan::wan_up = false; -bool IPACM_Wan::wan_up_v6 = false; -uint8_t IPACM_Wan::xlat_mux_id = 0; - -uint32_t IPACM_Wan::curr_wan_ip = 0; -int IPACM_Wan::num_v4_flt_rule = 0; -int IPACM_Wan::num_v6_flt_rule = 0; - -struct ipa_flt_rule_add IPACM_Wan::flt_rule_v4[IPA_MAX_FLT_RULE]; -struct ipa_flt_rule_add IPACM_Wan::flt_rule_v6[IPA_MAX_FLT_RULE]; - -char IPACM_Wan::wan_up_dev_name[IF_NAME_LEN]; - -bool IPACM_Wan::backhaul_is_sta_mode = false; -bool IPACM_Wan::is_ext_prop_set = false; - -int IPACM_Wan::num_ipv4_modem_pdn = 0; -int IPACM_Wan::num_ipv6_modem_pdn = 0; - -bool IPACM_Wan::embms_is_on = false; -bool IPACM_Wan::backhaul_is_wan_bridge = false; - -uint32_t IPACM_Wan::backhaul_ipv6_prefix[2]; - -#ifdef FEATURE_IPA_ANDROID -int IPACM_Wan::ipa_if_num_tether_v4_total = 0; -int IPACM_Wan::ipa_if_num_tether_v6_total = 0; - -int IPACM_Wan::ipa_if_num_tether_v4[IPA_MAX_IFACE_ENTRIES]; -int IPACM_Wan::ipa_if_num_tether_v6[IPA_MAX_IFACE_ENTRIES]; -#endif - -IPACM_Wan::IPACM_Wan(int iface_index, - ipacm_wan_iface_type is_sta_mode, - uint8_t *mac_addr) : IPACM_Iface(iface_index) -{ - num_firewall_v4 = 0; - num_firewall_v6 = 0; - wan_route_rule_v4_hdl = NULL; - wan_route_rule_v6_hdl = NULL; - wan_route_rule_v6_hdl_a5 = NULL; - wan_client = NULL; - - if(iface_query != NULL) - { - wan_route_rule_v4_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t)); - wan_route_rule_v6_hdl = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t)); - wan_route_rule_v6_hdl_a5 = (uint32_t *)calloc(iface_query->num_tx_props, sizeof(uint32_t)); - IPACMDBG_H("IPACM->IPACM_Wan(%d) constructor: Tx:%d\n", ipa_if_num, iface_query->num_tx_props); - } - m_is_sta_mode = is_sta_mode; - - wan_v4_addr_set = false; - wan_v4_addr_gw_set = false; - wan_v6_addr_gw_set = false; - active_v4 = false; - active_v6 = false; - header_set_v4 = false; - header_set_v6 = false; - header_partial_default_wan_v4 = false; - header_partial_default_wan_v6 = false; - hdr_hdl_sta_v4 = 0; - hdr_hdl_sta_v6 = 0; - num_ipv6_dest_flt_rule = 0; - memset(ipv6_dest_flt_rule_hdl, 0, MAX_DEFAULT_v6_ROUTE_RULES*sizeof(uint32_t)); - memset(ipv6_prefix, 0, sizeof(ipv6_prefix)); - memset(wan_v6_addr_gw, 0, sizeof(wan_v6_addr_gw)); - ext_prop = NULL; - is_ipv6_frag_firewall_flt_rule_installed = false; - ipv6_frag_firewall_flt_rule_hdl = 0; - - num_wan_client = 0; - header_name_count = 0; - memset(invalid_mac, 0, sizeof(invalid_mac)); - - is_xlat = false; - hdr_hdl_dummy_v6 = 0; - hdr_proc_hdl_dummy_v6 = 0; - is_default_gateway = false; - m_fd_ipa = 0; - wan_client_len = 0; - - if(iface_query != NULL) - { - wan_client_len = (sizeof(ipa_wan_client)) + (iface_query->num_tx_props * sizeof(wan_client_rt_hdl)); - wan_client = (ipa_wan_client *)calloc(IPA_MAX_NUM_WAN_CLIENTS, wan_client_len); - if (wan_client == NULL) - { - IPACMERR("unable to allocate memory\n"); - return; - } - IPACMDBG_H("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props); - } - - - if(m_is_sta_mode == Q6_WAN) - { - IPACMDBG_H("The new WAN interface is modem.\n"); - is_default_gateway = false; - query_ext_prop(); - } - else - { - IPACMDBG_H("The new WAN interface is WLAN STA.\n"); - } - - m_fd_ipa = open(IPA_DEVICE_NAME, O_RDWR); - if(0 == m_fd_ipa) - { - IPACMERR("Failed to open %s\n",IPA_DEVICE_NAME); - } - - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == EMBMS_IF) - { - IPACMDBG(" IPACM->IPACM_Wan_eMBMS(%d)\n", ipa_if_num); - embms_is_on = true; - install_wan_filtering_rule(false); - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - if(tx_prop != NULL) - { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); - } - } - else - { - IPACMDBG(" IPACM->IPACM_Wan(%d)\n", ipa_if_num); - } - return; -} - -IPACM_Wan::~IPACM_Wan() -{ - IPACM_EvtDispatcher::deregistr(this); - IPACM_IfaceManager::deregistr(this); - return; -} - -/* handle new_address event */ -int IPACM_Wan::handle_addr_evt(ipacm_event_data_addr *data) -{ - struct ipa_ioc_add_rt_rule *rt_rule; - struct ipa_rt_rule_add *rt_rule_entry; - struct ipa_ioc_add_flt_rule *flt_rule; - struct ipa_flt_rule_add flt_rule_entry; - struct ipa_ioc_get_hdr hdr; - - const int NUM_RULES = 1; - int num_ipv6_addr, len; - int res = IPACM_SUCCESS; - - memset(&hdr, 0, sizeof(hdr)); - if(tx_prop == NULL || rx_prop == NULL) - { - IPACMDBG_H("Either tx or rx property is NULL, return.\n"); - return IPACM_SUCCESS; - } - - /* Update the IP Type. */ - config_ip_type(data->iptype); - - if (data->iptype == IPA_IP_v6) - { - for(num_ipv6_addr=0;num_ipv6_addr<num_dft_rt_v6;num_ipv6_addr++) - { - if((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) && - (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) && - (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) && - (ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3])) - { - IPACMDBG_H("find matched ipv6 address, index:%d \n", num_ipv6_addr); - return IPACM_SUCCESS; - break; - } - } - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM_RULES * sizeof(struct ipa_rt_rule_add)); - - if (!rt_rule) - { - IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = NUM_RULES; - rt_rule->ip = data->iptype; - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name)); - - rt_rule_entry = &rt_rule->rules[0]; - if(m_is_sta_mode == Q6_WAN) - { - strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); - hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(m_header.GetHeaderHandle(&hdr) == false) - { - IPACMERR("Failed to get QMAP header.\n"); - return IPACM_FAILURE; - } - rt_rule_entry->rule.hdr_hdl = hdr.hdl; - } - rt_rule_entry->at_rear = false; - if(m_is_sta_mode == Q6_WAN) - { - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; - } - else - { - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; - } - rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = data->ipv6_addr[0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = data->ipv6_addr[1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = data->ipv6_addr[2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = data->ipv6_addr[3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; - ipv6_addr[num_dft_rt_v6][0] = data->ipv6_addr[0]; - ipv6_addr[num_dft_rt_v6][1] = data->ipv6_addr[1]; - ipv6_addr[num_dft_rt_v6][2] = data->ipv6_addr[2]; - ipv6_addr[num_dft_rt_v6][3] = data->ipv6_addr[3]; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (rt_rule_entry->status) - { - IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); - res = rt_rule_entry->status; - goto fail; - } - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6] = rt_rule_entry->rt_rule_hdl; - - /* setup same rule for v6_wan table*/ - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name)); - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (rt_rule_entry->status) - { - IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); - res = rt_rule_entry->status; - goto fail; - } - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1] = rt_rule_entry->rt_rule_hdl; - - IPACMDBG_H("ipv6 wan iface rt-rule hdl=0x%x hdl=0x%x, num_dft_rt_v6: %d \n", - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6], - dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES + 2*num_dft_rt_v6+1],num_dft_rt_v6); - - /* add default filtering rules when wan-iface get global v6-prefix */ - if (num_dft_rt_v6 == 1) - { - if(m_is_sta_mode == Q6_WAN) - { - modem_ipv6_pdn_index = num_ipv6_modem_pdn; - num_ipv6_modem_pdn++; - IPACMDBG_H("Now the number of modem ipv6 pdn is %d.\n", num_ipv6_modem_pdn); - init_fl_rule_ex(data->iptype); - } - else - { - init_fl_rule(data->iptype); - } - } - - /* add WAN DL interface IP specific flt rule for IPv6 when backhaul is not Q6 */ - if(m_is_sta_mode != Q6_WAN) - { - if(rx_prop != NULL && is_global_ipv6_addr(data->ipv6_addr) - && num_ipv6_dest_flt_rule < MAX_DEFAULT_v6_ROUTE_RULES) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); - - flt_rule = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!flt_rule) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - flt_rule->commit = 1; - flt_rule->ep = rx_prop->rx[0].src_pipe; - flt_rule->global = false; - flt_rule->ip = IPA_IP_v6; - flt_rule->num_rules = 1; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(flt_rule_entry.rule.attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - memcpy(flt_rule_entry.rule.attrib.u.v6.dst_addr, data->ipv6_addr, sizeof(flt_rule_entry.rule.attrib.u.v6.dst_addr)); - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; - memcpy(&(flt_rule->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (m_filtering.AddFilteringRule(flt_rule) == false) - { - IPACMERR("Error Adding Filtering rule, aborting...\n"); - free(flt_rule); - res = IPACM_FAILURE; - goto fail; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - ipv6_dest_flt_rule_hdl[num_ipv6_dest_flt_rule] = flt_rule->rules[0].flt_rule_hdl; - IPACMDBG_H("IPv6 dest filter rule %d HDL:0x%x\n", num_ipv6_dest_flt_rule, ipv6_dest_flt_rule_hdl[num_ipv6_dest_flt_rule]); - num_ipv6_dest_flt_rule++; - free(flt_rule); - } - } - } - /* store ipv6 prefix if the ipv6 address is not link local */ - if(is_global_ipv6_addr(data->ipv6_addr)) - { - memcpy(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)); - } - num_dft_rt_v6++; - } - else - { - if(wan_v4_addr_set) - { - /* check iface ipv4 same or not */ - if(data->ipv4_addr == wan_v4_addr) - { - IPACMDBG_H("Already setup device (%s) ipv4 and it didn't change(0x%x)\n", dev_name, data->ipv4_addr); - return IPACM_SUCCESS; - } - else - { - IPACMDBG_H(" device (%s) ipv4 addr is changed\n", dev_name); - /* Delete default v4 RT rule */ - IPACMDBG_H("Delete default v4 routing rules\n"); - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) - { - IPACMERR("Routing old RT rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - } - - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM_RULES * sizeof(struct ipa_rt_rule_add)); - - if (!rt_rule) - { - IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = NUM_RULES; - rt_rule->ip = data->iptype; - rt_rule_entry = &rt_rule->rules[0]; - if(m_is_sta_mode == Q6_WAN) - { - strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); - hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(m_header.GetHeaderHandle(&hdr) == false) - { - IPACMERR("Failed to get QMAP header.\n"); - return IPACM_FAILURE; - } - rt_rule_entry->rule.hdr_hdl = hdr.hdl; - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; - } - else - { - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; - } - rt_rule_entry->at_rear = false; - rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; - /* still need setup v4 default routing rule to A5*/ - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.attrib.u.v4.dst_addr = data->ipv4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - else if (rt_rule_entry->status) - { - IPACMERR("rt rule adding failed. Result=%d\n", rt_rule_entry->status); - res = rt_rule_entry->status; - goto fail; - } - dft_rt_rule_hdl[0] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("ipv4 wan iface rt-rule hdll=0x%x\n", dft_rt_rule_hdl[0]); - /* initial multicast/broadcast/fragment filter rule */ - - /* only do one time */ - if(!wan_v4_addr_set) - { - /* initial multicast/broadcast/fragment filter rule */ - if(m_is_sta_mode == Q6_WAN) - { - modem_ipv4_pdn_index = num_ipv4_modem_pdn; - num_ipv4_modem_pdn++; - IPACMDBG_H("Now the number of modem ipv4 pdn is %d.\n", num_ipv4_modem_pdn); - init_fl_rule_ex(data->iptype); - } - else - { - init_fl_rule(data->iptype); - } - } - - wan_v4_addr = data->ipv4_addr; - wan_v4_addr_set = true; - - if (m_is_sta_mode == Q6_WAN) - curr_wan_ip = data->ipv4_addr; - - IPACMDBG_H("Receved wan ipv4-addr:0x%x\n",wan_v4_addr); - } - - IPACMDBG_H("number of default route rules %d\n", num_dft_rt_v6); - -fail: - free(rt_rule); - - return res; -} - -void IPACM_Wan::event_callback(ipa_cm_event_id event, void *param) -{ - int ipa_interface_index; - - switch (event) - { - case IPA_WLAN_LINK_DOWN_EVENT: - { - if(m_is_sta_mode == WLAN_WAN) - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WLAN_LINK_DOWN_EVENT\n"); - handle_down_evt(); - /* reset the STA-iface category to unknown */ - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat = UNKNOWN_IF; - IPACMDBG_H("IPA_WAN_STA (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - delete this; - return; - } - } - } - break; - - case IPA_WAN_XLAT_CONNECT_EVENT: - { - IPACMDBG_H("Recieved IPA_WAN_XLAT_CONNECT_EVENT\n"); - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - ipa_interface_index = IPACM_Iface::iface_ipa_index_query(data->if_index); - if ((ipa_interface_index == ipa_if_num) && (m_is_sta_mode == Q6_WAN)) - { - is_xlat = true; - IPACMDBG_H("WAN-LTE (%s) link up, iface: %d is_xlat: \n", - IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name,data->if_index, is_xlat); - } - break; - } - case IPA_CFG_CHANGE_EVENT: - { - if ( (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ipa_if_cate) && - (m_is_sta_mode ==ECM_WAN)) - { - IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT and category did not change(wan_mode:%d)\n", m_is_sta_mode); - IPACMDBG_H("Now the cradle wan mode is %d.\n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode); - if(is_default_gateway == true) - { - if(backhaul_is_wan_bridge == false && IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == BRIDGE) - { - IPACMDBG_H("Cradle wan mode switch to bridge mode.\n"); - backhaul_is_wan_bridge = true; - } - else if(backhaul_is_wan_bridge == true && IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER) - { - IPACMDBG_H("Cradle wan mode switch to router mode.\n"); - backhaul_is_wan_bridge = false; - } - else - { - IPACMDBG_H("No cradle mode switch, return.\n"); - return; - } - /* post wan mode change event to LAN/WLAN */ - if(IPACM_Wan::wan_up == true) - { - IPACMDBG_H("This interface is default GW.\n"); - ipacm_cmd_q_data evt_data; - memset(&evt_data, 0, sizeof(evt_data)); - - ipacm_event_cradle_wan_mode *data_wan_mode = NULL; - data_wan_mode = (ipacm_event_cradle_wan_mode *)malloc(sizeof(ipacm_event_cradle_wan_mode)); - if(data_wan_mode == NULL) - { - IPACMERR("unable to allocate memory.\n"); - return; - } - data_wan_mode->cradle_wan_mode = IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode; - evt_data.event = IPA_CRADLE_WAN_MODE_SWITCH; - evt_data.evt_data = data_wan_mode; - IPACMDBG_H("Posting IPA_CRADLE_WAN_MODE_SWITCH event.\n"); - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - /* update the firewall flt rule actions */ - if(active_v4) - { - del_dft_firewall_rules(IPA_IP_v4); - config_dft_firewall_rules(IPA_IP_v4); - } - if(active_v6) - { - del_dft_firewall_rules(IPA_IP_v6); - config_dft_firewall_rules(IPA_IP_v6); - } - } - else - { - IPACMDBG_H("This interface is not default GW, ignore.\n"); - } - } - else if ( (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat != ipa_if_cate) && - (m_is_sta_mode ==ECM_WAN)) - { - IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT and category changed(wan_mode:%d)\n", m_is_sta_mode); - /* posting link-up event for cradle use-case */ - ipacm_cmd_q_data evt_data; - memset(&evt_data, 0, sizeof(evt_data)); - - ipacm_event_data_fid *data_fid = NULL; - data_fid = (ipacm_event_data_fid *)malloc(sizeof(ipacm_event_data_fid)); - if(data_fid == NULL) - { - IPACMERR("unable to allocate memory for IPA_USB_LINK_UP_EVENT data_fid\n"); - return; - } - if(IPACM_Iface::ipa_get_if_index(dev_name, &(data_fid->if_index))) - { - IPACMERR("Error while getting interface index for %s device", dev_name); - } - evt_data.event = IPA_USB_LINK_UP_EVENT; - evt_data.evt_data = data_fid; - IPACMDBG_H("Posting event:%d\n", evt_data.event); - IPACM_EvtDispatcher::PostEvt(&evt_data); - - /* delete previous instance */ - handle_down_evt(); - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - delete this; - return; - } - } - break; - - case IPA_LINK_DOWN_EVENT: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - if(m_is_sta_mode == Q6_WAN) - { - IPACMDBG_H("Received IPA_LINK_DOWN_EVENT\n"); - handle_down_evt_ex(); - IPACMDBG_H("IPA_WAN_Q6 (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - delete this; - return; - } - else if (m_is_sta_mode == ECM_WAN) - { - IPACMDBG_H("Received IPA_LINK_DOWN_EVENT(wan_mode:%d)\n", m_is_sta_mode); - /* delete previous instance */ - handle_down_evt(); - IPACMDBG_H("IPA_WAN_CRADLE (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - delete this; - return; - } - } - } - break; - - case IPA_ADDR_ADD_EVENT: - { - ipacm_event_data_addr *data = (ipacm_event_data_addr *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - - if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) || - (data->iptype == IPA_IP_v6 && - data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 && - data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) ) - { - IPACMDBG_H("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n"); - return; - } - - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Get IPA_ADDR_ADD_EVENT: IF ip type %d, incoming ip type %d\n", ip_type, data->iptype); - /* check v4 not setup before, v6 can have 2 iface ip */ - if( (data->iptype == IPA_IP_v4) - || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES))) - { - IPACMDBG_H("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6); - handle_addr_evt(data); - /* checking if SW-RT_enable */ - if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true && - m_is_sta_mode != Q6_WAN) - { - /* handle software routing enable event*/ - IPACMDBG_H("IPA_SW_ROUTING_ENABLE for iface: %s \n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - handle_software_routing_enable(); - } - - } - } - } - break; - - - case IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT: - { - ipacm_event_data_iptype *data = (ipacm_event_data_iptype *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT (Android) for ip-type (%d)\n", data->iptype); - /* The special below condition is to handle default gateway */ - if ((data->iptype == IPA_IP_v4) && (ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)) - { - if (active_v4 == false) - { -#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN - IPACMDBG_H("adding routing table(upstream), dev (%s) ip-type(%d) default gw (%x)\n", dev_name,data->iptype, wan_v4_addr_gw); - wan_v4_addr_gw = data->ipv4_addr_gw; - wan_v4_addr_gw_set = true; - /* Check & construct STA header */ - handle_sta_header_add_evt(); -#else - IPACMDBG_H("adding routing table(upstream), dev (%s) ip-type(%d)\n", dev_name,data->iptype); -#endif - handle_route_add_evt(data->iptype); - } -#ifdef FEATURE_IPA_ANDROID - /* using ipa_if_index, not netdev_index */ - post_wan_up_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether)); -#endif - } - else if ((data->iptype == IPA_IP_v6) && (ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)) - { - if(ipv6_prefix[0] == 0 && ipv6_prefix[1] == 0) - { - IPACMDBG_H("IPv6 default route comes earlier than global IP, ignore.\n"); - return; - } - - if (active_v6 == false) - { - IPACMDBG_H("\n get default v6 route (dst:00.00.00.00) upstream\n"); -#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN - IPACMDBG_H(" IPV6 gateway: %08x:%08x:%08x:%08x \n", - data->ipv6_addr_gw[0], data->ipv6_addr_gw[1], data->ipv6_addr_gw[2], data->ipv6_addr_gw[3]); - wan_v6_addr_gw[0] = data->ipv6_addr_gw[0]; - wan_v6_addr_gw[1] = data->ipv6_addr_gw[1]; - wan_v6_addr_gw[2] = data->ipv6_addr_gw[2]; - wan_v6_addr_gw[3] = data->ipv6_addr_gw[3]; - wan_v6_addr_gw_set = true; - /* Check & construct STA header */ - handle_sta_header_add_evt(); -#endif - handle_route_add_evt(data->iptype); - } -#ifdef FEATURE_IPA_ANDROID - /* using ipa_if_index, not netdev_index */ - post_wan_up_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether)); -#endif - } - } - else /* double check if current default iface is not itself */ - { - if ((data->iptype == IPA_IP_v4) && (active_v4 == true)) - { - IPACMDBG_H("Received v4 IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - IPACMDBG_H("need clean default v4 route (dst:0.0.0.0) for old iface (%s)\n", dev_name); - wan_v4_addr_gw_set = false; - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v4); - } - else - { - del_dft_firewall_rules(IPA_IP_v4); - handle_route_del_evt(IPA_IP_v4); - } - } - else if ((data->iptype == IPA_IP_v6) && (active_v6 == true)) - { - IPACMDBG_H("Received v6 IPA_WAN_UPSTREAM_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - IPACMDBG_H("need clean default v6 route for old iface (%s)\n", dev_name); - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v6); - } - else - { - del_dft_firewall_rules(IPA_IP_v6); - handle_route_del_evt(IPA_IP_v6); - } - } - } - } - break; - - case IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT: - { - ipacm_event_data_iptype *data = (ipacm_event_data_iptype *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WAN_UPSTREAM_ROUTE_DEL_EVENT\n"); - if ((data->iptype == IPA_IP_v4) && (active_v4 == true)) - { - IPACMDBG_H("get del default v4 route (dst:0.0.0.0)\n"); - wan_v4_addr_gw_set = false; -#ifdef FEATURE_IPA_ANDROID - /* using ipa_if_index, not netdev_index */ - post_wan_down_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether)); - /* no any ipv4 tether iface support*/ - if(IPACM_Wan::ipa_if_num_tether_v4_total != 0) - { - IPACMDBG_H("still have tether ipv4 client on upsteam iface\n"); - return; - } -#endif - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v4); - } - else - { - del_dft_firewall_rules(IPA_IP_v4); - handle_route_del_evt(IPA_IP_v4); - } - } - else if ((data->iptype == IPA_IP_v6) && (active_v6 == true)) - { -#ifdef FEATURE_IPA_ANDROID - /* using ipa_if_index, not netdev_index */ - post_wan_down_tether_evt(data->iptype, iface_ipa_index_query(data->if_index_tether)); - /* no any ipv6 tether iface support*/ - if(IPACM_Wan::ipa_if_num_tether_v6_total != 0) - { - IPACMDBG_H("still have tether ipv6 client on upsteam iface\n"); - return; - } -#endif - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v6); - } - else - { - del_dft_firewall_rules(IPA_IP_v6); - handle_route_del_evt(IPA_IP_v6); - } - } - } - } - break; - case IPA_NETWORK_STATS_UPDATE_EVENT: - { - ipa_get_apn_data_stats_resp_msg_v01 *data = (ipa_get_apn_data_stats_resp_msg_v01 *)param; - if (!data->apn_data_stats_list_valid) - { - IPACMERR("not valid APN\n"); - return; - } - else - { - handle_network_stats_update(data); - } - } - break; - case IPA_ROUTE_ADD_EVENT: - { - ipacm_event_data_addr *data = (ipacm_event_data_addr *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_ROUTE_ADD_EVENT\n"); - IPACMDBG_H("ipv4 addr 0x%x\n", data->ipv4_addr); - IPACMDBG_H("ipv4 addr mask 0x%x\n", data->ipv4_addr_mask); - - /* The special below condition is to handle default gateway */ - if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == false) - && (ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX)) - { - wan_v4_addr_gw = data->ipv4_addr_gw; - wan_v4_addr_gw_set = true; - IPACMDBG_H("adding routing table, dev (%s) ip-type(%d), default gw (%x)\n", dev_name,data->iptype, wan_v4_addr_gw); - /* Check & construct STA header */ - handle_sta_header_add_evt(); - handle_route_add_evt(data->iptype); - /* Add IPv6 routing table if XLAT is enabled */ - if(is_xlat && (m_is_sta_mode == Q6_WAN) && (active_v6 == false)) - { - IPACMDBG_H("XLAT enabled: adding IPv6 routing table dev (%s)\n", dev_name); - handle_route_add_evt(IPA_IP_v6); - } - } - else if ((data->iptype == IPA_IP_v6) && - (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]) && - (active_v6 == false) && (ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX)) - { - if(ipv6_prefix[0] == 0 && ipv6_prefix[1] == 0) - { - IPACMDBG_H("IPv6 default route comes earlier than global IP, ignore.\n"); - return; - } - - IPACMDBG_H("\n get default v6 route (dst:00.00.00.00)\n"); - IPACMDBG_H(" IPV6 dst: %08x:%08x:%08x:%08x \n", - data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); - IPACMDBG_H(" IPV6 gateway: %08x:%08x:%08x:%08x \n", - data->ipv6_addr_gw[0], data->ipv6_addr_gw[1], data->ipv6_addr_gw[2], data->ipv6_addr_gw[3]); - wan_v6_addr_gw[0] = data->ipv6_addr_gw[0]; - wan_v6_addr_gw[1] = data->ipv6_addr_gw[1]; - wan_v6_addr_gw[2] = data->ipv6_addr_gw[2]; - wan_v6_addr_gw[3] = data->ipv6_addr_gw[3]; - wan_v6_addr_gw_set = true; - /* Check & construct STA header */ - handle_sta_header_add_evt(); - handle_route_add_evt(data->iptype); - } - } - else /* double check if current default iface is not itself */ - { - if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == true)) - { - IPACMDBG_H("Received v4 IPA_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - IPACMDBG_H("ipv4 addr 0x%x\n", data->ipv4_addr); - IPACMDBG_H("ipv4 addr mask 0x%x\n", data->ipv4_addr_mask); - IPACMDBG_H("need clean default v4 route (dst:0.0.0.0) for old iface (%s)\n", dev_name); - wan_v4_addr_gw_set = false; - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v4); - } - else - { - del_dft_firewall_rules(IPA_IP_v4); - handle_route_del_evt(IPA_IP_v4); - } - } - else if ((data->iptype == IPA_IP_v6) && (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]) && (active_v6 == true)) - { - IPACMDBG_H("Received v6 IPA_ROUTE_ADD_EVENT for other iface (%s)\n", IPACM_Iface::ipacmcfg->iface_table[ipa_interface_index].iface_name); - IPACMDBG_H("need clean default v6 route for old iface (%s)\n", dev_name); - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v6); - } - else - { - del_dft_firewall_rules(IPA_IP_v6); - handle_route_del_evt(IPA_IP_v6); - } - } - } - } - break; - - case IPA_ROUTE_DEL_EVENT: - { - ipacm_event_data_addr *data = (ipacm_event_data_addr *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_ROUTE_DEL_EVENT\n"); - if ((data->iptype == IPA_IP_v4) && (!data->ipv4_addr) && (!data->ipv4_addr_mask) && (active_v4 == true)) - { - IPACMDBG_H("get del default v4 route (dst:0.0.0.0)\n"); - wan_v4_addr_gw_set = false; - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v4); - - if(is_xlat && active_v6 == true) - { - IPACMDBG_H("XLAT enabled: Delete IPv6 routing table dev (%s)\n", dev_name); - del_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v6); - } - } - else - { - del_dft_firewall_rules(IPA_IP_v4); - handle_route_del_evt(IPA_IP_v4); - } - } - else if ((data->iptype == IPA_IP_v6) && (!data->ipv6_addr[0]) && (!data->ipv6_addr[1]) && (!data->ipv6_addr[2]) && (!data->ipv6_addr[3]) && (active_v6 == true)) - { - - IPACMDBG_H("get del default v6 route (dst:00.00.00.00)\n"); - if(m_is_sta_mode == Q6_WAN) - { - del_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v6); - } - else - { - del_dft_firewall_rules(IPA_IP_v6); - handle_route_del_evt(IPA_IP_v6); - } - } - } - } - break; - - case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT: - { - ipacm_event_data_all *data = (ipacm_event_data_all *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n"); - - if (m_is_sta_mode == WLAN_WAN) - { - if (data->iptype == IPA_IP_v4 && data->ipv4_addr == wan_v4_addr) - { - IPACMDBG_H("Ignore IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n"); - IPACMDBG_H("for its own ipv4 address\n"); - return; - } - else if (data->iptype == IPA_IP_v6) - { - for (int num_ipv6_addr = 0; num_ipv6_addr < num_dft_rt_v6; num_ipv6_addr++) - { - if ((ipv6_addr[num_ipv6_addr][0] == data->ipv6_addr[0]) && - (ipv6_addr[num_ipv6_addr][1] == data->ipv6_addr[1]) && - (ipv6_addr[num_ipv6_addr][2] == data->ipv6_addr[2]) && - (ipv6_addr[num_ipv6_addr][3] == data->ipv6_addr[3])) - { - IPACMDBG_H("Ignore IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT in STA mode\n"); - IPACMDBG_H("for its own ipv6 address\n"); - return; - } - } - } - } - - IPACMDBG_H("wan-iface got client \n"); - /* first construc WAN-client full header */ - if(memcmp(data->mac_addr, - invalid_mac, - sizeof(data->mac_addr)) == 0) - { - IPACMDBG_H("Received invalid Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - data->mac_addr[0], data->mac_addr[1], data->mac_addr[2], - data->mac_addr[3], data->mac_addr[4], data->mac_addr[5]); - return; - } - - handle_wan_hdr_init(data->mac_addr); - IPACMDBG_H("construct wan-client header and route rules \n"); - /* Associate with IP and construct RT-rule */ - if (handle_wan_client_ipaddr(data) == IPACM_FAILURE) - { - return; - } - handle_wan_client_route_rule(data->mac_addr, data->iptype); - /* Check & construct STA header */ - handle_sta_header_add_evt(); - return; - } - } - break; - - case IPA_SW_ROUTING_ENABLE: - IPACMDBG_H("Received IPA_SW_ROUTING_ENABLE\n"); - /* handle software routing enable event */ - if(m_is_sta_mode == Q6_WAN) - { - install_wan_filtering_rule(true); - } - else - { - handle_software_routing_enable(); - } - break; - - case IPA_SW_ROUTING_DISABLE: - IPACMDBG_H("Received IPA_SW_ROUTING_DISABLE\n"); - /* handle software routing disable event */ - if(m_is_sta_mode == Q6_WAN) - { - /* send current DL rules to modem */ - install_wan_filtering_rule(false); - softwarerouting_act = false; - } - else - { - handle_software_routing_disable(); - } - break; - - case IPA_FIREWALL_CHANGE_EVENT: - IPACMDBG_H("Received IPA_FIREWALL_CHANGE_EVENT\n"); - - if(m_is_sta_mode == Q6_WAN) - { - if(is_default_gateway == false) - { - IPACMDBG_H("Interface %s is not default gw, return.\n", dev_name); - return; - } - - if(ip_type == IPA_IP_v4) - { - del_wan_firewall_rule(IPA_IP_v4); - config_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - } - else if(ip_type == IPA_IP_v6) - { - del_wan_firewall_rule(IPA_IP_v6); - config_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - } - else if(ip_type == IPA_IP_MAX) - { - del_wan_firewall_rule(IPA_IP_v4); - config_wan_firewall_rule(IPA_IP_v4); - - del_wan_firewall_rule(IPA_IP_v6); - config_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - } - else - { - IPACMERR("IP type is not expected.\n"); - } - } - else - { - if (active_v4) - { - del_dft_firewall_rules(IPA_IP_v4); - config_dft_firewall_rules(IPA_IP_v4); - } - if (active_v6) - { - - del_dft_firewall_rules(IPA_IP_v6); - config_dft_firewall_rules(IPA_IP_v6); - } - } - break; - - case IPA_WLAN_SWITCH_TO_SCC: - if(IPACM_Wan::backhaul_is_sta_mode == true) - { - IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_SCC\n"); - if(ip_type == IPA_IP_MAX) - { - handle_wlan_SCC_MCC_switch(true, IPA_IP_v4); - handle_wlan_SCC_MCC_switch(true, IPA_IP_v6); - handle_wan_client_SCC_MCC_switch(true, IPA_IP_v4); - handle_wan_client_SCC_MCC_switch(true, IPA_IP_v6); - } - else - { - handle_wlan_SCC_MCC_switch(true, ip_type); - handle_wan_client_SCC_MCC_switch(true, ip_type); - } - } - break; - - case IPA_WLAN_SWITCH_TO_MCC: - if(IPACM_Wan::backhaul_is_sta_mode == true) - { - IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_MCC\n"); - if(ip_type == IPA_IP_MAX) - { - handle_wlan_SCC_MCC_switch(false, IPA_IP_v4); - handle_wlan_SCC_MCC_switch(false, IPA_IP_v6); - handle_wan_client_SCC_MCC_switch(false, IPA_IP_v4); - handle_wan_client_SCC_MCC_switch(false, IPA_IP_v6); - } - else - { - handle_wlan_SCC_MCC_switch(false, ip_type); - handle_wan_client_SCC_MCC_switch(false, ip_type); - } - } - break; - - default: - break; - } - - return; -} - -/* wan default route/filter rule configuration */ -int IPACM_Wan::handle_route_add_evt(ipa_ip_type iptype) -{ - - /* add default WAN route */ - struct ipa_ioc_add_rt_rule *rt_rule = NULL; - struct ipa_rt_rule_add *rt_rule_entry; - struct ipa_ioc_get_hdr sRetHeader; - uint32_t cnt, tx_index = 0; - const int NUM = 1; - ipacm_cmd_q_data evt_data; - struct ipa_ioc_copy_hdr sCopyHeader; /* checking if partial header*/ - struct ipa_ioc_get_hdr hdr; - - IPACMDBG_H("ip-type:%d\n", iptype); - - /* copy header from tx-property, see if partial or not */ - /* assume all tx-property uses the same header name for v4 or v6*/ - - if(tx_prop == NULL) - { - IPACMDBG_H("No tx properties, ignore default route setting\n"); - return IPACM_SUCCESS; - } - - is_default_gateway = true; - IPACMDBG_H("Default route is added to iface %s.\n", dev_name); - - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == BRIDGE) - { - IPACM_Wan::backhaul_is_wan_bridge = true; - } - else - { - IPACM_Wan::backhaul_is_wan_bridge = false; - } - IPACMDBG_H("backhaul_is_wan_bridge ?: %d \n", IPACM_Wan::backhaul_is_wan_bridge); - - if (m_is_sta_mode !=Q6_WAN) - { - IPACM_Wan::backhaul_is_sta_mode = true; - if((iptype==IPA_IP_v4) && (header_set_v4 != true)) - { - header_partial_default_wan_v4 = true; - IPACMDBG_H("STA ipv4-header haven't constructed \n"); - return IPACM_SUCCESS; - } - else if((iptype==IPA_IP_v6) && (header_set_v6 != true)) - { - header_partial_default_wan_v6 = true; - IPACMDBG_H("STA ipv6-header haven't constructed \n"); - return IPACM_SUCCESS; - } - } - else - { - IPACM_Wan::backhaul_is_sta_mode = false; - IPACMDBG_H("reset backhaul to LTE \n"); - - if (iface_query != NULL && iface_query->num_ext_props > 0) - { - if(ext_prop == NULL) - { - IPACMERR("Extended property is empty.\n"); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->SetQmapId(ext_prop->ext[0].mux_id); - IPACMDBG_H("Setting up QMAP ID %d.\n", ext_prop->ext[0].mux_id); - } - } - else - { - IPACMERR("iface_query is empty.\n"); - return IPACM_FAILURE; - } - } -#if 0 - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==iptype) - break; - } - - if(tx_prop->tx[cnt].hdr_name != NULL) - { - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s\n", sCopyHeader.name); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - IPACMERR("ioctl copy header failed"); - return IPACM_FAILURE; - } - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - if(sCopyHeader.is_partial) - { - IPACMDBG_H("Not setup default WAN routing rules cuz the header is not complete\n"); - if(iptype==IPA_IP_v4) - { - header_partial_default_wan_v4 = true; - } - else - { - header_partial_default_wan_v6 = true; - } - return IPACM_SUCCESS; - } - else - { - if(iptype==IPA_IP_v4) - { - header_partial_default_wan_v4 = false; - } - else - { - header_partial_default_wan_v6 = false; - } - } - } -#endif - - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_add)); - - if (!rt_rule) - { - IPACMERR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = (uint8_t)NUM; - rt_rule->ip = iptype; - - - IPACMDBG_H(" WAN table created %s \n", rt_rule->rt_tbl_name); - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = true; - - if(m_is_sta_mode != Q6_WAN) - { - IPACMDBG_H(" WAN instance is in STA mode \n"); - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if(iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n", - tx_index, tx_prop->tx[tx_index].ip,iptype); - continue; - } - - /* use the STA-header handler */ - if (iptype == IPA_IP_v4) - { - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v4; - } - else - { - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_v6.name, sizeof(rt_rule->rt_tbl_name)); - rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v6; - } - - if(IPACM_Iface::ipacmcfg->isMCC_Mode == true) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - if (iptype == IPA_IP_v4) - { - rt_rule_entry->rule.attrib.u.v4.dst_addr = 0; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0; -#ifdef FEATURE_IPA_V3 - - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - wan_route_rule_v4_hdl[tx_index] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("Got ipv4 wan-route rule hdl:0x%x,tx:%d,ip-type: %d \n", - wan_route_rule_v4_hdl[tx_index], - tx_index, - iptype); - } - else - { - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - wan_route_rule_v6_hdl[tx_index] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("Set ipv6 wan-route rule hdl for v6_lan_table:0x%x,tx:%d,ip-type: %d \n", - wan_route_rule_v6_hdl[tx_index], - tx_index, - iptype); - } - } - } - - /* add a catch-all rule in wan dl routing table */ - - if (iptype == IPA_IP_v6) - { - strlcpy(rt_rule->rt_tbl_name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, sizeof(rt_rule->rt_tbl_name)); - memset(rt_rule_entry, 0, sizeof(struct ipa_rt_rule_add)); - rt_rule_entry->at_rear = true; - if(m_is_sta_mode == Q6_WAN) - { - memset(&hdr, 0, sizeof(hdr)); - strlcpy(hdr.name, tx_prop->tx[0].hdr_name, sizeof(hdr.name)); - hdr.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(m_header.GetHeaderHandle(&hdr) == false) - { - IPACMERR("Failed to get QMAP header.\n"); - return IPACM_FAILURE; - } - rt_rule_entry->rule.hdr_hdl = hdr.hdl; - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_WAN_CONS; - } - else - { - /* create dummy ethernet header for v6 RX path */ - IPACMDBG_H("Construct dummy ethernet_header\n"); - if (add_dummy_rx_hdr()) - { - IPACMERR("Construct dummy ethernet_header failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - rt_rule_entry->rule.hdr_proc_ctx_hdl = hdr_proc_hdl_dummy_v6; - rt_rule_entry->rule.dst = IPA_CLIENT_APPS_LAN_CONS; - } - rt_rule_entry->rule.attrib.attrib_mask = IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - wan_route_rule_v6_hdl_a5[0] = rt_rule_entry->rt_rule_hdl; - IPACMDBG_H("Set ipv6 wan-route rule hdl for v6_wan_table:0x%x,tx:%d,ip-type: %d \n", - wan_route_rule_v6_hdl_a5[0], 0, iptype); - } - - ipacm_event_iface_up *wanup_data; - wanup_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up)); - if (wanup_data == NULL) - { - IPACMERR("Unable to allocate memory\n"); - free(rt_rule); - return IPACM_FAILURE; - } - memset(wanup_data, 0, sizeof(ipacm_event_iface_up)); - - if (iptype == IPA_IP_v4) - { - IPACM_Wan::wan_up = true; - active_v4 = true; - memcpy(IPACM_Wan::wan_up_dev_name, - dev_name, - sizeof(IPACM_Wan::wan_up_dev_name)); - - if(m_is_sta_mode == Q6_WAN) - { - config_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - } - else - { - config_dft_firewall_rules(IPA_IP_v4); - } - - memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname)); - wanup_data->ipv4_addr = wan_v4_addr; - if (m_is_sta_mode!=Q6_WAN) - { - wanup_data->is_sta = true; - } - else - { - wanup_data->is_sta = false; - } - IPACMDBG_H("Posting IPA_HANDLE_WAN_UP with below information:\n"); - IPACMDBG_H("if_name:%s, ipv4_address:0x%x, is sta mode:%d\n", - wanup_data->ifname, wanup_data->ipv4_addr, wanup_data->is_sta); - memset(&evt_data, 0, sizeof(evt_data)); - - /* send xlat configuration for installing uplink rules */ - if(is_xlat && (m_is_sta_mode == Q6_WAN)) - { - IPACM_Wan::xlat_mux_id = ext_prop->ext[0].mux_id; - wanup_data->xlat_mux_id = IPACM_Wan::xlat_mux_id; - IPACMDBG_H("Set xlat configuraiton with below information:\n"); - IPACMDBG_H("xlat_enabled: xlat_mux_id: %d \n", - is_xlat, xlat_mux_id); - } - else - { - IPACM_Wan::xlat_mux_id = 0; - wanup_data->xlat_mux_id = 0; - IPACMDBG_H("No xlat configuratio:\n"); - } - evt_data.event = IPA_HANDLE_WAN_UP; - evt_data.evt_data = (void *)wanup_data; - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - else - { - memcpy(backhaul_ipv6_prefix, ipv6_prefix, sizeof(backhaul_ipv6_prefix)); - IPACMDBG_H("Setup backhaul ipv6 prefix to be 0x%08x%08x.\n", backhaul_ipv6_prefix[0], backhaul_ipv6_prefix[1]); - - IPACM_Wan::wan_up_v6 = true; - active_v6 = true; - memcpy(IPACM_Wan::wan_up_dev_name, - dev_name, - sizeof(IPACM_Wan::wan_up_dev_name)); - - if(m_is_sta_mode == Q6_WAN) - { - config_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - } - else - { - config_dft_firewall_rules(IPA_IP_v6); - } - - memcpy(wanup_data->ifname, dev_name, sizeof(wanup_data->ifname)); - if (m_is_sta_mode!=Q6_WAN) - { - wanup_data->is_sta = true; - } - else - { - wanup_data->is_sta = false; - } - memcpy(wanup_data->ipv6_prefix, ipv6_prefix, sizeof(wanup_data->ipv6_prefix)); - IPACMDBG_H("Posting IPA_HANDLE_WAN_UP_V6 with below information:\n"); - IPACMDBG_H("if_name:%s, is sta mode: %d\n", wanup_data->ifname, wanup_data->is_sta); - IPACMDBG_H("ipv6 prefix: 0x%08x%08x.\n", ipv6_prefix[0], ipv6_prefix[1]); - memset(&evt_data, 0, sizeof(evt_data)); - evt_data.event = IPA_HANDLE_WAN_UP_V6; - evt_data.evt_data = (void *)wanup_data; - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); - - if(rt_rule != NULL) - { - free(rt_rule); - } - return IPACM_SUCCESS; -} - -#ifdef FEATURE_IPA_ANDROID -/* wan default route/filter rule configuration */ -int IPACM_Wan::post_wan_up_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether) -{ - ipacm_cmd_q_data evt_data; - ipacm_event_iface_up_tehter *wanup_data; - - wanup_data = (ipacm_event_iface_up_tehter *)malloc(sizeof(ipacm_event_iface_up_tehter)); - if (wanup_data == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return IPACM_FAILURE; - } - memset(wanup_data, 0, sizeof(ipacm_event_iface_up_tehter)); - - wanup_data->if_index_tether = ipa_if_num_tether; - if (m_is_sta_mode!=Q6_WAN) - { - wanup_data->is_sta = true; - } - else - { - wanup_data->is_sta = false; - } - IPACMDBG_H("Posting IPA_HANDLE_WAN_UP_TETHER with below information:\n"); - IPACMDBG_H("tether_if_name:%s, is sta mode:%d\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, wanup_data->is_sta); - memset(&evt_data, 0, sizeof(evt_data)); - - if (iptype == IPA_IP_v4) - { - evt_data.event = IPA_HANDLE_WAN_UP_TETHER; - /* Add support tether ifaces to its array*/ - IPACM_Wan::ipa_if_num_tether_v4[IPACM_Wan::ipa_if_num_tether_v4_total] = ipa_if_num_tether; - IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v4_total(%d) on wan_iface(%s)\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, - IPACM_Wan::ipa_if_num_tether_v4_total, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - IPACM_Wan::ipa_if_num_tether_v4_total++; - } - else - { - evt_data.event = IPA_HANDLE_WAN_UP_V6_TETHER; - memcpy(wanup_data->ipv6_prefix, ipv6_prefix, sizeof(wanup_data->ipv6_prefix)); - /* Add support tether ifaces to its array*/ - IPACM_Wan::ipa_if_num_tether_v6[IPACM_Wan::ipa_if_num_tether_v6_total] = ipa_if_num_tether; - IPACMDBG_H("adding tether iface(%s) ipa_if_num_tether_v6_total(%d) on wan_iface(%s)\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, - IPACM_Wan::ipa_if_num_tether_v6_total, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - IPACM_Wan::ipa_if_num_tether_v6_total++; - } - evt_data.evt_data = (void *)wanup_data; - IPACM_EvtDispatcher::PostEvt(&evt_data); - - return IPACM_SUCCESS; -} - -/* wan default route/filter rule configuration */ -int IPACM_Wan::post_wan_down_tether_evt(ipa_ip_type iptype, int ipa_if_num_tether) -{ - ipacm_cmd_q_data evt_data; - ipacm_event_iface_up_tehter *wandown_data; - int i, j; - - wandown_data = (ipacm_event_iface_up_tehter *)malloc(sizeof(ipacm_event_iface_up_tehter)); - if (wandown_data == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return IPACM_FAILURE; - } - memset(wandown_data, 0, sizeof(ipacm_event_iface_up_tehter)); - - wandown_data->if_index_tether = ipa_if_num_tether; - if (m_is_sta_mode!=Q6_WAN) - { - wandown_data->is_sta = true; - } - else - { - wandown_data->is_sta = false; - } - IPACMDBG_H("Posting IPA_HANDLE_WAN_DOWN_TETHER with below information:\n"); - IPACMDBG_H("tether_if_name:%s, is sta mode:%d\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name, wandown_data->is_sta); - memset(&evt_data, 0, sizeof(evt_data)); - - if (iptype == IPA_IP_v4) - { - evt_data.event = IPA_HANDLE_WAN_DOWN_TETHER; - /* delete support tether ifaces to its array*/ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++) - { - if(IPACM_Wan::ipa_if_num_tether_v4[i] == ipa_if_num_tether) - { - IPACMDBG_H("Found tether client at position %d name(%s)\n", i, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name); - break; - } - } - if(i == IPACM_Wan::ipa_if_num_tether_v4_total) - { - IPACMDBG_H("Not finding the tether client.\n"); - free(wandown_data); - return IPACM_SUCCESS; - } - for(j = i+1; j < IPACM_Wan::ipa_if_num_tether_v4_total; j++) - { - IPACM_Wan::ipa_if_num_tether_v4[j-1] = IPACM_Wan::ipa_if_num_tether_v4[j]; - } - IPACM_Wan::ipa_if_num_tether_v4_total--; - IPACMDBG_H("Now the total num of ipa_if_num_tether_v4_total is %d on wan-iface(%s)\n", - IPACM_Wan::ipa_if_num_tether_v4_total, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - } - else - { - evt_data.event = IPA_HANDLE_WAN_DOWN_V6_TETHER; - /* delete support tether ifaces to its array*/ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++) - { - if(IPACM_Wan::ipa_if_num_tether_v6[i] == ipa_if_num_tether) - { - IPACMDBG_H("Found tether client at position %d name(%s)\n", i, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether].iface_name); - break; - } - } - if(i == IPACM_Wan::ipa_if_num_tether_v6_total) - { - IPACMDBG_H("Not finding the tether client.\n"); - free(wandown_data); - return IPACM_SUCCESS; - } - for(j = i+1; j < IPACM_Wan::ipa_if_num_tether_v6_total; j++) - { - IPACM_Wan::ipa_if_num_tether_v6[j-1] = IPACM_Wan::ipa_if_num_tether_v6[j]; - } - IPACM_Wan::ipa_if_num_tether_v6_total--; - IPACMDBG_H("Now the total num of ipa_if_num_tether_v6_total is %d on wan-iface(%s)\n", - IPACM_Wan::ipa_if_num_tether_v6_total, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - } - evt_data.evt_data = (void *)wandown_data; - IPACM_EvtDispatcher::PostEvt(&evt_data); - return IPACM_SUCCESS; -} -#endif - -/* construct complete ethernet header */ -int IPACM_Wan::handle_sta_header_add_evt() -{ - int res = IPACM_SUCCESS, index = IPACM_INVALID_INDEX; - if((header_set_v4 == true) || (header_set_v6 == true)) - { - IPACMDBG_H("Already add STA full header\n"); - return IPACM_SUCCESS; - } - - /* checking if the ipv4 same as default route */ - if(wan_v4_addr_gw_set) - { - index = get_wan_client_index_ipv4(wan_v4_addr_gw); - if (index != IPACM_INVALID_INDEX) - { - IPACMDBG_H("Matched client index: %d\n", index); - IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wan_client, index)->mac[0], - get_client_memptr(wan_client, index)->mac[1], - get_client_memptr(wan_client, index)->mac[2], - get_client_memptr(wan_client, index)->mac[3], - get_client_memptr(wan_client, index)->mac[4], - get_client_memptr(wan_client, index)->mac[5]); - - if(get_client_memptr(wan_client, index)->ipv4_header_set) - { - hdr_hdl_sta_v4 = get_client_memptr(wan_client, index)->hdr_hdl_v4; - header_set_v4 = true; - IPACMDBG_H("add full ipv4 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v4); - /* store external_ap's MAC */ - memcpy(ext_router_mac_addr, get_client_memptr(wan_client, index)->mac, sizeof(ext_router_mac_addr)); - } - else - { - IPACMERR(" wan-client got ipv4 however didn't construct complete ipv4 header \n"); - return IPACM_FAILURE; - } - - if(get_client_memptr(wan_client, index)->ipv6_header_set) - { - hdr_hdl_sta_v6 = get_client_memptr(wan_client, index)->hdr_hdl_v6; - header_set_v6 = true; - IPACMDBG_H("add full ipv6 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v6); - } - else - { - IPACMERR(" wan-client got ipv6 however didn't construct complete ipv6 header \n"); - return IPACM_FAILURE; - } - } - else - { - IPACMDBG_H(" currently can't find matched wan-client's MAC-addr, waiting for header construction\n"); - return IPACM_SUCCESS; - } - } - - /* checking if the ipv4 same as default route */ - if(wan_v6_addr_gw_set) - { - index = get_wan_client_index_ipv6(wan_v6_addr_gw); - if (index != IPACM_INVALID_INDEX) - { - IPACMDBG_H("Matched client index: %d\n", index); - IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wan_client, index)->mac[0], - get_client_memptr(wan_client, index)->mac[1], - get_client_memptr(wan_client, index)->mac[2], - get_client_memptr(wan_client, index)->mac[3], - get_client_memptr(wan_client, index)->mac[4], - get_client_memptr(wan_client, index)->mac[5]); - - if(get_client_memptr(wan_client, index)->ipv6_header_set) - { - hdr_hdl_sta_v6 = get_client_memptr(wan_client, index)->hdr_hdl_v6; - header_set_v6 = true; - IPACMDBG_H("add full ipv6 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v6); - /* store external_ap's MAC */ - memcpy(ext_router_mac_addr, get_client_memptr(wan_client, index)->mac, sizeof(ext_router_mac_addr)); - } - else - { - IPACMERR(" wan-client got ipv6 however didn't construct complete ipv4 header \n"); - return IPACM_FAILURE; - } - - if(get_client_memptr(wan_client, index)->ipv4_header_set) - { - hdr_hdl_sta_v4 = get_client_memptr(wan_client, index)->hdr_hdl_v4; - header_set_v4 = true; - IPACMDBG_H("add full ipv4 header hdl: (%x)\n", get_client_memptr(wan_client, index)->hdr_hdl_v4); - } - else - { - IPACMERR(" wan-client got ipv4 however didn't construct complete ipv4 header \n"); - return IPACM_FAILURE; - } - } - else - { - IPACMDBG_H(" currently can't find matched wan-client's MAC-addr, waiting for header construction\n"); - return IPACM_SUCCESS; - } - } - - /* see if default routes are setup before constructing full header */ - if(header_partial_default_wan_v4 == true) - { - handle_route_add_evt(IPA_IP_v4); - } - - if(header_partial_default_wan_v6 == true) - { - handle_route_add_evt(IPA_IP_v6); - } - return res; -} - -/* For checking attribute mask field in firewall rules for IPv6 only */ -bool IPACM_Wan::check_dft_firewall_rules_attr_mask(IPACM_firewall_conf_t *firewall_config) -{ - uint32_t attrib_mask = 0ul; - attrib_mask = IPA_FLT_SRC_PORT_RANGE | - IPA_FLT_DST_PORT_RANGE | - IPA_FLT_TYPE | - IPA_FLT_CODE | - IPA_FLT_SPI | - IPA_FLT_SRC_PORT | - IPA_FLT_DST_PORT; - - for (int i = 0; i < firewall_config->num_extd_firewall_entries; i++) - { - if (firewall_config->extd_firewall_entries[i].ip_vsn == 6) - { - if (firewall_config->extd_firewall_entries[i].attrib.attrib_mask & attrib_mask) - { - IPACMDBG_H("IHL based attribute mask is found: install IPv6 frag firewall rule \n"); - return true; - } - } - } - IPACMDBG_H("IHL based attribute mask is not found: no IPv6 frag firewall rule \n"); - return false; -} - -/* for STA mode: add firewall rules */ -int IPACM_Wan::config_dft_firewall_rules(ipa_ip_type iptype) -{ - struct ipa_flt_rule_add flt_rule_entry; - int i, rule_v4 = 0, rule_v6 = 0, len; - - IPACMDBG_H("ip-family: %d; \n", iptype); - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - /* default firewall is disable and the rule action is drop */ - memset(&firewall_config, 0, sizeof(firewall_config)); - strlcpy(firewall_config.firewall_config_file, "/etc/mobileap_firewall.xml", sizeof(firewall_config.firewall_config_file)); - - IPACMDBG_H("Firewall XML file is %s \n", firewall_config.firewall_config_file); - if (IPACM_SUCCESS == IPACM_read_firewall_xml(firewall_config.firewall_config_file, &firewall_config)) - { - IPACMDBG_H("QCMAP Firewall XML read OK \n"); - /* find the number of v4/v6 firewall rules */ - for (i = 0; i < firewall_config.num_extd_firewall_entries; i++) - { - if (firewall_config.extd_firewall_entries[i].ip_vsn == 4) - { - rule_v4++; - } - else - { - rule_v6++; - } - } - IPACMDBG_H("firewall rule v4:%d v6:%d total:%d\n", rule_v4, rule_v6, firewall_config.num_extd_firewall_entries); - } - else - { - IPACMERR("QCMAP Firewall XML read failed, no that file, use default configuration \n"); - } - - /* construct ipa_ioc_add_flt_rule with N firewall rules */ - ipa_ioc_add_flt_rule *m_pFilteringTable = NULL; - len = sizeof(struct ipa_ioc_add_flt_rule) + 1 * sizeof(struct ipa_flt_rule_add); - m_pFilteringTable = (struct ipa_ioc_add_flt_rule *)calloc(1, len); - if (!m_pFilteringTable) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - - if(iptype == IPA_IP_v6 && - firewall_config.firewall_enable == true && - check_dft_firewall_rules_attr_mask(&firewall_config)) - { - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v6; - m_pFilteringTable->num_rules = (uint8_t)1; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.at_rear = true; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = false; - flt_rule_entry.rule.hashable = false; -#endif - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - memcpy(&flt_rule_entry.rule.attrib, &rx_prop->rx[0].attrib, sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - ipv6_frag_firewall_flt_rule_hdl = m_pFilteringTable->rules[0].flt_rule_hdl; - is_ipv6_frag_firewall_flt_rule_installed = true; - IPACMDBG_H("Installed IPv6 frag firewall rule, handle %d.\n", ipv6_frag_firewall_flt_rule_hdl); - } - } - - if (iptype == IPA_IP_v4) - { - if (rule_v4 == 0) - { - memset(m_pFilteringTable, 0, len); - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v4; - m_pFilteringTable->num_rules = (uint8_t)1; - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_lan_v4)) - { - IPACMERR("m_routing.GetRoutingTable(rt_tbl_lan_v4) Failed.\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - /* firewall disable, all traffic are allowed */ - if(firewall_config.firewall_enable == true) - { - flt_rule_entry.at_rear = true; - - /* default action for v4 is go DST_NAT unless user set to exception*/ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - } - else - { - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER) - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } - } - else - { - flt_rule_entry.at_rear = true; - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER) - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl; - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000; - - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - - /* copy filter hdls */ - dft_wan_fl_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl; - } - else - { - memset(m_pFilteringTable, 0, len); - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v4; - m_pFilteringTable->num_rules = (uint8_t)1; - - IPACMDBG_H("Retreiving Routing handle for routing table name:%s\n", - IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name); - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_lan_v4)) - { - IPACMERR("m_routing.GetRoutingTable(&rt_tbl_lan_v4=0x%p) Failed.\n", &IPACM_Iface::ipacmcfg->rt_tbl_lan_v4); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - IPACMDBG_H("Routing handle for wan routing table:0x%x\n", IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl); - - if(firewall_config.firewall_enable == true) - { - rule_v4 = 0; - for (i = 0; i < firewall_config.num_extd_firewall_entries; i++) - { - if (firewall_config.extd_firewall_entries[i].ip_vsn == 4) - { - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl; - - /* Accept v4 matched rules*/ - if(firewall_config.rule_action_accept == true) - { - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER) - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, - &firewall_config.extd_firewall_entries[i].attrib, - sizeof(struct ipa_rule_attrib)); - - IPACMDBG_H("rx property attrib mask: 0x%x\n", rx_prop->rx[0].attrib.attrib_mask); - flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask; - flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask; - flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data; - - /* check if the rule is define as TCP_UDP, split into 2 rules, 1 for TCP and 1 UDP */ - if (firewall_config.extd_firewall_entries[i].attrib.u.v4.protocol - == IPACM_FIREWALL_IPPROTO_TCP_UDP) - { - /* insert TCP rule*/ - flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_TCP; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", - m_pFilteringTable->rules[0].rule.attrib.attrib_mask); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - /* save v4 firewall filter rule handler */ - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", - m_pFilteringTable->rules[rule_v4].flt_rule_hdl, - m_pFilteringTable->rules[rule_v4].status); - firewall_hdl_v4[rule_v4] = m_pFilteringTable->rules[0].flt_rule_hdl; - num_firewall_v4++; - rule_v4++; - } - - /* insert UDP rule*/ - flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_UDP; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", - m_pFilteringTable->rules[0].rule.attrib.attrib_mask); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - /* save v4 firewall filter rule handler */ - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", - m_pFilteringTable->rules[rule_v4].flt_rule_hdl, - m_pFilteringTable->rules[rule_v4].status); - firewall_hdl_v4[rule_v4] = m_pFilteringTable->rules[0].flt_rule_hdl; - num_firewall_v4++; - rule_v4++; - } - } - else - { - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", - m_pFilteringTable->rules[0].rule.attrib.attrib_mask); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - /* save v4 firewall filter rule handler */ - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", - m_pFilteringTable->rules[rule_v4].flt_rule_hdl, - m_pFilteringTable->rules[rule_v4].status); - firewall_hdl_v4[rule_v4] = m_pFilteringTable->rules[0].flt_rule_hdl; - num_firewall_v4++; - rule_v4++; - } - } - } - } /* end of firewall ipv4 filter rule add for loop*/ - } - /* configure default filter rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - /* firewall disable, all traffic are allowed */ - if(firewall_config.firewall_enable == true) - { - flt_rule_entry.at_rear = true; - - /* default action for v4 is go DST_NAT unless user set to exception*/ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - } - else - { - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER) - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } - } - else - { - flt_rule_entry.at_rear = true; - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_mode == ROUTER) - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.hdl; - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000; - - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", - m_pFilteringTable->rules[0].rule.attrib.attrib_mask); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding RuleTable(0) to Filtering, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - - /* copy filter hdls */ - dft_wan_fl_hdl[0] = m_pFilteringTable->rules[0].flt_rule_hdl; - } - - } - else - { - if (rule_v6 == 0) - { - memset(m_pFilteringTable, 0, len); - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v6; - m_pFilteringTable->num_rules = (uint8_t)1; - - /* Construct ICMP rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; - flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - /* copy filter hdls */ - dft_wan_fl_hdl[2] = m_pFilteringTable->rules[0].flt_rule_hdl; - - /* End of construct ICMP rule */ - - /* v6 default route */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v6)) //rt_tbl_wan_v6 rt_tbl_v6 - { - IPACMERR("m_routing.GetRoutingTable(rt_tbl_wan_v6) Failed.\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl; - - /* firewall disable, all traffic are allowed */ - if(firewall_config.firewall_enable == true) - { - flt_rule_entry.at_rear = true; - - /* default action for v6 is PASS_TO_ROUTE unless user set to exception*/ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } - else - { - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; - - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - - /* copy filter hdls */ - dft_wan_fl_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl; - } - else - { - memset(m_pFilteringTable, 0, len); - - m_pFilteringTable->commit = 1; - m_pFilteringTable->ep = rx_prop->rx[0].src_pipe; - m_pFilteringTable->global = false; - m_pFilteringTable->ip = IPA_IP_v6; - m_pFilteringTable->num_rules = (uint8_t)1; - - if (false == m_routing.GetRoutingTable(&IPACM_Iface::ipacmcfg->rt_tbl_wan_v6)) - { - IPACMERR("m_routing.GetRoutingTable(rt_tbl_wan_v6) Failed.\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - - if(firewall_config.firewall_enable == true) - { - rule_v6 = 0; - for (i = 0; i < firewall_config.num_extd_firewall_entries; i++) - { - if (firewall_config.extd_firewall_entries[i].ip_vsn == 6) - { - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - /* matched rules for v6 go PASS_TO_ROUTE */ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl; - memcpy(&flt_rule_entry.rule.attrib, - &firewall_config.extd_firewall_entries[i].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask; - flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask; - flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data; - - /* check if the rule is define as TCP/UDP */ - if (firewall_config.extd_firewall_entries[i].attrib.u.v6.next_hdr == IPACM_FIREWALL_IPPROTO_TCP_UDP) - { - /* insert TCP rule*/ - flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_TCP; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - /* save v4 firewall filter rule handler */ - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - firewall_hdl_v6[rule_v6] = m_pFilteringTable->rules[0].flt_rule_hdl; - num_firewall_v6++; - rule_v6++; - } - - /* insert UDP rule*/ - flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_UDP; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - /* save v6 firewall filter rule handler */ - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - firewall_hdl_v6[rule_v6] = m_pFilteringTable->rules[0].flt_rule_hdl; - num_firewall_v6++; - rule_v6++; - } - } - else - { - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - /* save v6 firewall filter rule handler */ - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - firewall_hdl_v6[rule_v6] = m_pFilteringTable->rules[0].flt_rule_hdl; - num_firewall_v6++; - rule_v6++; - } - } - } - } /* end of firewall ipv6 filter rule add for loop*/ - } - - /* Construct ICMP rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.eq_attrib_type = 0; - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; - flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6; - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - /* copy filter hdls */ - dft_wan_fl_hdl[2] = m_pFilteringTable->rules[0].flt_rule_hdl; - /* End of construct ICMP rule */ - - /* setup default wan filter rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.rt_tbl_hdl = IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.hdl; - - /* firewall disable, all traffic are allowed */ - if(firewall_config.firewall_enable == true) - { - flt_rule_entry.at_rear = true; - - /* default action for v6 is PASS_TO_ROUTE unless user set to exception*/ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_EXCEPTION; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - } - else - { - flt_rule_entry.at_rear = true; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; - - memcpy(&(m_pFilteringTable->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - if (false == m_filtering.AddFilteringRule(m_pFilteringTable)) - { - IPACMERR("Error Adding Filtering rules, aborting...\n"); - free(m_pFilteringTable); - return IPACM_FAILURE; - } - else - { - IPACM_Iface::ipacmcfg->increaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - IPACMDBG_H("flt rule hdl0=0x%x, status=0x%x\n", m_pFilteringTable->rules[0].flt_rule_hdl, m_pFilteringTable->rules[0].status); - } - /* copy filter hdls*/ - dft_wan_fl_hdl[1] = m_pFilteringTable->rules[0].flt_rule_hdl; - } - } - - if(m_pFilteringTable != NULL) - { - free(m_pFilteringTable); - } - return IPACM_SUCCESS; -} - -/* configure the initial firewall filter rules */ -int IPACM_Wan::config_dft_firewall_rules_ex(struct ipa_flt_rule_add *rules, int rule_offset, ipa_ip_type iptype) -{ - struct ipa_flt_rule_add flt_rule_entry; - int i; - int num_rules = 0, original_num_rules = 0; - ipa_ioc_get_rt_tbl_indx rt_tbl_idx; - ipa_ioc_generate_flt_eq flt_eq; - int pos = rule_offset; - - IPACMDBG_H("ip-family: %d; \n", iptype); - - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if(rules == NULL || rule_offset < 0) - { - IPACMERR("No filtering table is available.\n"); - return IPACM_FAILURE; - } - - /* default firewall is disable and the rule action is drop */ - memset(&firewall_config, 0, sizeof(firewall_config)); - strlcpy(firewall_config.firewall_config_file, "/etc/mobileap_firewall.xml", sizeof(firewall_config.firewall_config_file)); - - IPACMDBG_H("Firewall XML file is %s \n", firewall_config.firewall_config_file); - if (IPACM_SUCCESS == IPACM_read_firewall_xml(firewall_config.firewall_config_file, &firewall_config)) - { - IPACMDBG_H("QCMAP Firewall XML read OK \n"); - } - else - { - IPACMERR("QCMAP Firewall XML read failed, no that file, use default configuration \n"); - } - - /* add IPv6 frag rule when firewall is enabled*/ - if(iptype == IPA_IP_v6 && - firewall_config.firewall_enable == true && - check_dft_firewall_rules_attr_mask(&firewall_config)) - { - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.at_rear = true; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = false; -#endif - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.at_rear = false; - flt_rule_entry.rule.hashable = false; -#endif - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - rt_tbl_idx.ip = IPA_IP_v6; - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - IPACMDBG_H("IPv6 frag flt rule uses routing table index %d\n", rt_tbl_idx.idx); - - flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask; - flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask; - flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data; - - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_FRAGMENT; - - change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = IPA_IP_v6; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - pos++; - IPACM_Wan::num_v6_flt_rule++; - } - - if (iptype == IPA_IP_v4) - { - original_num_rules = IPACM_Wan::num_v4_flt_rule; - if(firewall_config.firewall_enable == true) - { - for (i = 0; i < firewall_config.num_extd_firewall_entries; i++) - { - if (firewall_config.extd_firewall_entries[i].ip_vsn == 4) - { - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - - /* Accept v4 matched rules*/ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - rt_tbl_idx.ip = iptype; - if(flt_rule_entry.rule.action == IPA_PASS_TO_ROUTING) - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - } - else /*pass to dst nat*/ - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, IPA_RESOURCE_NAME_MAX); - } - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memcpy(&flt_rule_entry.rule.attrib, - &firewall_config.extd_firewall_entries[i].attrib, - sizeof(struct ipa_rule_attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask; - flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask; - flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data; - - change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib); - - /* check if the rule is define as TCP_UDP, split into 2 rules, 1 for TCP and 1 UDP */ - if (firewall_config.extd_firewall_entries[i].attrib.u.v4.protocol == IPACM_FIREWALL_IPPROTO_TCP_UDP) - { - /* insert TCP rule*/ - flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_TCP; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask); - pos++; - num_firewall_v4++; - IPACM_Wan::num_v4_flt_rule++; - - /* insert UDP rule*/ - flt_rule_entry.rule.attrib.u.v4.protocol = IPACM_FIREWALL_IPPROTO_UDP; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask); - pos++; - num_firewall_v4++; - IPACM_Wan::num_v4_flt_rule++; - } - else - { - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask); - pos++; - num_firewall_v4++; - IPACM_Wan::num_v4_flt_rule++; - } - } - } /* end of firewall ipv4 filter rule add for loop*/ - } - /* configure default filter rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - - /* firewall disable, all traffic are allowed */ - if(firewall_config.firewall_enable == true) - { - /* default action for v4 is go DST_NAT unless user set to exception*/ - if(firewall_config.rule_action_accept == true) - { - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - } - else - { - if(isWan_Bridge_Mode()) - { - IPACMDBG_H("ODU is in bridge mode. \n"); - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - } - else - { - flt_rule_entry.rule.action = IPA_PASS_TO_DST_NAT; - } - } -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - rt_tbl_idx.ip = iptype; - - if(flt_rule_entry.rule.action == IPA_PASS_TO_ROUTING) - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - } - else /*pass to dst nat*/ - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, IPA_RESOURCE_NAME_MAX); - } - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000; - - change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACMDBG_H("Filter rule attrib mask: 0x%x\n", rules[pos].rule.attrib.attrib_mask); - pos++; - num_firewall_v4++; - IPACM_Wan::num_v4_flt_rule++; - - num_rules = IPACM_Wan::num_v4_flt_rule - original_num_rules - 1; - } - else - { - original_num_rules = IPACM_Wan::num_v6_flt_rule; - - if(firewall_config.firewall_enable == true) - { - for (i = 0; i < firewall_config.num_extd_firewall_entries; i++) - { - if (firewall_config.extd_firewall_entries[i].ip_vsn == 6) - { - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - rt_tbl_idx.ip = iptype; - - /* matched rules for v6 go PASS_TO_ROUTE */ - if(firewall_config.rule_action_accept == true) - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX); - } - else - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - } - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memcpy(&flt_rule_entry.rule.attrib, - &firewall_config.extd_firewall_entries[i].attrib, - sizeof(struct ipa_rule_attrib)); - - flt_rule_entry.rule.attrib.attrib_mask |= rx_prop->rx[0].attrib.attrib_mask; - flt_rule_entry.rule.attrib.meta_data_mask = rx_prop->rx[0].attrib.meta_data_mask; - flt_rule_entry.rule.attrib.meta_data = rx_prop->rx[0].attrib.meta_data; - - change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib); - - /* check if the rule is define as TCP/UDP */ - if (firewall_config.extd_firewall_entries[i].attrib.u.v6.next_hdr == IPACM_FIREWALL_IPPROTO_TCP_UDP) - { - /* insert TCP rule*/ - flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_TCP; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - pos++; - num_firewall_v6++; - IPACM_Wan::num_v6_flt_rule++; - - /* insert UDP rule*/ - flt_rule_entry.rule.attrib.u.v6.next_hdr = IPACM_FIREWALL_IPPROTO_UDP; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - pos++; - num_firewall_v6++; - IPACM_Wan::num_v6_flt_rule++; - } - else - { - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - pos++; - num_firewall_v6++; - IPACM_Wan::num_v6_flt_rule++; - } - } - } /* end of firewall ipv6 filter rule add for loop*/ - } - - /* setup default wan filter rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - rt_tbl_idx.ip = iptype; - /* firewall disable, all traffic are allowed */ - if(firewall_config.firewall_enable == true) - { - /* default action for v6 is PASS_TO_ROUTE unless user set to exception*/ - if(firewall_config.rule_action_accept == true) - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - } - else - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX); - } - } - else - { - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, IPA_RESOURCE_NAME_MAX); - } - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[1].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; - - change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[pos]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - pos++; - num_firewall_v6++; - IPACM_Wan::num_v6_flt_rule++; - - num_rules = IPACM_Wan::num_v6_flt_rule - original_num_rules - 1; - } - IPACMDBG_H("Constructed %d firewall rules for ip type %d\n", num_rules, iptype); - return IPACM_SUCCESS; -} - -int IPACM_Wan::init_fl_rule_ex(ipa_ip_type iptype) -{ - int res = IPACM_SUCCESS; - - char *dev_wlan0="wlan0"; - char *dev_wlan1="wlan1"; - char *dev_ecm0="ecm0"; - - /* ADD corresponding ipa_rm_resource_name of RX-endpoint before adding all IPV4V6 FT-rules */ - IPACMDBG_H(" dun add producer dependency from %s with registered rx-prop\n", dev_name); - - if(iptype == IPA_IP_v4) - { - if(modem_ipv4_pdn_index == 0) /* install ipv4 default modem DL filtering rules only once */ - { - /* reset the num_v4_flt_rule*/ - IPACM_Wan::num_v4_flt_rule = 0; - add_dft_filtering_rule(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4); - } - } - else if(iptype == IPA_IP_v6) - { - if(modem_ipv6_pdn_index == 0) /* install ipv6 default modem DL filtering rules only once */ - { - /* reset the num_v6_flt_rule*/ - IPACM_Wan::num_v6_flt_rule = 0; - add_dft_filtering_rule(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6); - } - } - else - { - IPACMERR("IP type is not expected.\n"); - res = IPACM_FAILURE; - goto fail; - } - install_wan_filtering_rule(false); - -fail: - return res; -} - -int IPACM_Wan::add_icmp_alg_rules(struct ipa_flt_rule_add *rules, int rule_offset, ipa_ip_type iptype) -{ - int res = IPACM_SUCCESS, i, original_num_rules = 0, num_rules = 0; - struct ipa_flt_rule_add flt_rule_entry; - IPACM_Config* ipacm_config = IPACM_Iface::ipacmcfg; - ipa_ioc_generate_flt_eq flt_eq; - ipa_ioc_get_rt_tbl_indx rt_tbl_idx; - - if(rules == NULL || rule_offset < 0) - { - IPACMERR("No filtering table is available.\n"); - return IPACM_FAILURE; - } - - if(iptype == IPA_IP_v4) - { - original_num_rules = IPACM_Wan::num_v4_flt_rule; - - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("WAN DL routing table %s has index %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, rt_tbl_idx.idx); - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - /* Configuring ICMP filtering rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* Multiple PDNs may exist so keep meta-data */ - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; - flt_rule_entry.rule.attrib.u.v4.protocol = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - IPACM_Wan::num_v4_flt_rule++; - - /* Configure ALG filtering rules */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* remove meta data mask */ - flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_SRC_PORT; - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; - for(i = 0; i < ipacm_config->ipa_num_alg_ports; i++) - { - flt_rule_entry.rule.attrib.src_port = ipacm_config->alg_table[i].port; - flt_rule_entry.rule.attrib.u.v4.protocol = ipacm_config->alg_table[i].protocol; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[rule_offset + 1 + i]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACM_Wan::num_v4_flt_rule++; - } - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* remove meta data mask */ - flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_PORT; - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_PROTOCOL; - for(i = 0; i < ipacm_config->ipa_num_alg_ports; i++) - { - flt_rule_entry.rule.attrib.dst_port = ipacm_config->alg_table[i].port; - flt_rule_entry.rule.attrib.u.v4.protocol = ipacm_config->alg_table[i].protocol; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[rule_offset + ipacm_config->ipa_num_alg_ports + 1 + i]), - &flt_rule_entry, - sizeof(struct ipa_flt_rule_add)); - IPACM_Wan::num_v4_flt_rule++; - } - num_rules = IPACM_Wan::num_v4_flt_rule - original_num_rules; - } - else /* IPv6 case */ - { - original_num_rules = IPACM_Wan::num_v6_flt_rule; - - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("WAN DL routing table %s has index %d\n", IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, rt_tbl_idx.idx); - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - /* Configuring ICMP filtering rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[1].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* Multiple PDNs may exist so keep meta-data */ - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_NEXT_HDR; - flt_rule_entry.rule.attrib.u.v6.next_hdr = (uint8_t)IPACM_FIREWALL_IPPROTO_ICMP6; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - IPACM_Wan::num_v6_flt_rule++; - - num_rules = IPACM_Wan::num_v6_flt_rule - original_num_rules; - } - -fail: - IPACMDBG_H("Constructed %d ICMP/ALG rules for ip type %d\n", num_rules, iptype); - return res; -} - -int IPACM_Wan::query_ext_prop() -{ - int fd, ret = IPACM_SUCCESS, cnt; - - if (iface_query->num_ext_props > 0) - { - fd = open(IPA_DEVICE_NAME, O_RDWR); - IPACMDBG_H("iface query-property \n"); - if (0 == fd) - { - IPACMERR("Failed opening %s.\n", IPA_DEVICE_NAME); - return IPACM_FAILURE; - } - - ext_prop = (struct ipa_ioc_query_intf_ext_props *) - calloc(1, sizeof(struct ipa_ioc_query_intf_ext_props) + - iface_query->num_ext_props * sizeof(struct ipa_ioc_ext_intf_prop)); - if(ext_prop == NULL) - { - IPACMERR("Unable to allocate memory.\n"); - return IPACM_FAILURE; - } - memcpy(ext_prop->name, dev_name, - sizeof(dev_name)); - ext_prop->num_ext_props = iface_query->num_ext_props; - - IPACMDBG_H("Query extended property for iface %s\n", ext_prop->name); - - ret = ioctl(fd, IPA_IOC_QUERY_INTF_EXT_PROPS, ext_prop); - if (ret < 0) - { - IPACMERR("ioctl IPA_IOC_QUERY_INTF_EXT_PROPS failed\n"); - /* ext_prop memory will free when iface-down*/ - free(ext_prop); - close(fd); - return ret; - } - - IPACMDBG_H("Wan interface has %d tx props, %d rx props and %d ext props\n", - iface_query->num_tx_props, iface_query->num_rx_props, iface_query->num_ext_props); - - for (cnt = 0; cnt < ext_prop->num_ext_props; cnt++) - { -#ifndef FEATURE_IPA_V3 - IPACMDBG_H("Ex(%d): ip-type: %d, mux_id: %d, flt_action: %d\n, rt_tbl_idx: %d, is_xlat_rule: %d flt_hdl: %d\n", - cnt, ext_prop->ext[cnt].ip, ext_prop->ext[cnt].mux_id, ext_prop->ext[cnt].action, - ext_prop->ext[cnt].rt_tbl_idx, ext_prop->ext[cnt].is_xlat_rule, ext_prop->ext[cnt].filter_hdl); -#else /* defined (FEATURE_IPA_V3) */ - IPACMDBG_H("Ex(%d): ip-type: %d, mux_id: %d, flt_action: %d\n, rt_tbl_idx: %d, is_xlat_rule: %d rule_id: %d\n", - cnt, ext_prop->ext[cnt].ip, ext_prop->ext[cnt].mux_id, ext_prop->ext[cnt].action, - ext_prop->ext[cnt].rt_tbl_idx, ext_prop->ext[cnt].is_xlat_rule, ext_prop->ext[cnt].rule_id); -#endif - } - - if(IPACM_Wan::is_ext_prop_set == false) - { - IPACM_Iface::ipacmcfg->SetExtProp(ext_prop); - IPACM_Wan::is_ext_prop_set = true; - } - close(fd); - } - return IPACM_SUCCESS; -} - -int IPACM_Wan::config_wan_firewall_rule(ipa_ip_type iptype) -{ - int res = IPACM_SUCCESS; - - IPACMDBG_H("Configure WAN DL firewall rules.\n"); - - if(iptype == IPA_IP_v4) - { - IPACM_Wan::num_v4_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4; - if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4)) - { - IPACMERR("Failed to add ICMP and ALG port filtering rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("Succeded in constructing ICMP/ALG rules for ip type %d\n", iptype); - - if(IPACM_FAILURE == config_dft_firewall_rules_ex(flt_rule_v4, IPACM_Wan::num_v4_flt_rule, IPA_IP_v4)) - { - IPACMERR("Failed to add firewall filtering rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("Succeded in constructing firewall rules for ip type %d\n", iptype); - } - else if(iptype == IPA_IP_v6) - { - IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6; - if(IPACM_FAILURE == add_icmp_alg_rules(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6)) - { - IPACMERR("Failed to add ICMP and ALG port filtering rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("Succeded in constructing ICMP/ALG rules for ip type %d\n", iptype); - - if(IPACM_FAILURE == config_dft_firewall_rules_ex(flt_rule_v6, IPACM_Wan::num_v6_flt_rule, IPA_IP_v6)) - { - IPACMERR("Failed to add firewall filtering rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("Succeded in constructing firewall rules for ip type %d\n", iptype); - } - else - { - IPACMERR("IP type is not expected.\n"); - return IPACM_FAILURE; - } - -fail: - return res; -} - -int IPACM_Wan::add_dft_filtering_rule(struct ipa_flt_rule_add *rules, int rule_offset, ipa_ip_type iptype) -{ - struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx; - struct ipa_flt_rule_add flt_rule_entry; - struct ipa_ioc_generate_flt_eq flt_eq; - int res = IPACM_SUCCESS; - - if(rules == NULL) - { - IPACMERR("No filtering table available.\n"); - return IPACM_FAILURE; - } - if(rx_prop == NULL) - { - IPACMERR("No tx property.\n"); - return IPACM_FAILURE; - } - - if (iptype == IPA_IP_v4) - { - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - IPACMDBG_H("rx property attrib mask:0x%x\n", rx_prop->rx[0].attrib.attrib_mask); - - /* Configuring Multicast Filtering Rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* remove meta data mask since we only install default flt rules once for all modem PDN*/ - flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xF0000000; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xE0000000; - - change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring Broadcast Filtering Rule */ - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0xFFFFFFFF; - - change_to_network_order(IPA_IP_v4, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[rule_offset + 1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - IPACM_Wan::num_v4_flt_rule += IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4; - IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4, iptype); - } - else /*insert rules for ipv6*/ - { - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - /* Configuring Multicast Filtering Rule */ - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - /* remove meta data mask since we only install default flt rules once for all modem PDN*/ - flt_rule_entry.rule.attrib.attrib_mask &= ~((uint32_t)IPA_FLT_META_DATA); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFF000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFF000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x00000000; - - change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(rules[rule_offset]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring fe80::/10 Link-Scoped Unicast Filtering Rule */ - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFC00000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFE800000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x00000000; - - change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[rule_offset + 1]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* Configuring fec0::/10 Reserved by IETF Filtering Rule */ - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0xFFC00000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0xFEC00000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0x00000000; - - change_to_network_order(IPA_IP_v6, &flt_rule_entry.rule.attrib); - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = iptype; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(rules[rule_offset + 2]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - -#ifdef FEATURE_IPA_ANDROID - IPACMDBG_H("Add TCP ctrl rules: total num %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6); - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - flt_rule_entry.at_rear = true; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - - flt_rule_entry.rule.retain_hdr = 1; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - flt_rule_entry.rule.eq_attrib_type = 1; - - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap = 0; - - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<1); - flt_rule_entry.rule.eq_attrib.protocol_eq_present = 1; - flt_rule_entry.rule.eq_attrib.protocol_eq = IPACM_FIREWALL_IPPROTO_TCP; - - flt_rule_entry.rule.eq_attrib.rule_eq_bitmap |= (1<<8); - flt_rule_entry.rule.eq_attrib.num_ihl_offset_meq_32 = 1; - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].offset = 12; - - /* add TCP FIN rule*/ - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_FIN_SHIFT); - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_FIN_SHIFT); - memcpy(&(rules[rule_offset + 3]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* add TCP SYN rule*/ - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_SYN_SHIFT); - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_SYN_SHIFT); - memcpy(&(rules[rule_offset + 4]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* add TCP RST rule*/ - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].value = (((uint32_t)1)<<TCP_RST_SHIFT); - flt_rule_entry.rule.eq_attrib.ihl_offset_meq_32[0].mask = (((uint32_t)1)<<TCP_RST_SHIFT); - memcpy(&(rules[rule_offset + 5]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); -#endif - - IPACM_Wan::num_v6_flt_rule += IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6; - IPACMDBG_H("Constructed %d default filtering rules for ip type %d\n", IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6, iptype); - } - -fail: - return res; -} - -int IPACM_Wan::del_wan_firewall_rule(ipa_ip_type iptype) -{ - if(iptype == IPA_IP_v4) - { - IPACM_Wan::num_v4_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4; - memset(&IPACM_Wan::flt_rule_v4[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4], 0, - (IPA_MAX_FLT_RULE - IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV4) * sizeof(struct ipa_flt_rule_add)); - } - else if(iptype == IPA_IP_v6) - { - IPACM_Wan::num_v6_flt_rule = IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6; - memset(&IPACM_Wan::flt_rule_v6[IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6], 0, - (IPA_MAX_FLT_RULE - IPA_V2_NUM_DEFAULT_WAN_FILTER_RULE_IPV6) * sizeof(struct ipa_flt_rule_add)); - } - else - { - IPACMERR("IP type is not expected.\n"); - return IPACM_FAILURE; - } - - return IPACM_SUCCESS; -} - -/*for STA mode: clean firewall filter rules */ -int IPACM_Wan::del_dft_firewall_rules(ipa_ip_type iptype) -{ - /* free v4 firewall filter rule */ - if (rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if ((iptype == IPA_IP_v4) && (active_v4 == true)) - { - if (num_firewall_v4 > IPACM_MAX_FIREWALL_ENTRIES) - { - IPACMERR("the number of v4 firewall entries overflow, aborting...\n"); - return IPACM_FAILURE; - } - if (num_firewall_v4 != 0) - { - if (m_filtering.DeleteFilteringHdls(firewall_hdl_v4, - IPA_IP_v4, num_firewall_v4) == false) - { - IPACMERR("Error Deleting Filtering rules, aborting...\n"); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_firewall_v4); - } - else - { - IPACMDBG_H("No ipv4 firewall rules, no need deleted\n"); - } - - if (m_filtering.DeleteFilteringHdls(dft_wan_fl_hdl, - IPA_IP_v4, 1) == false) - { - IPACMERR("Error Deleting Filtering rules, aborting...\n"); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, 1); - - num_firewall_v4 = 0; - } - - /* free v6 firewall filter rule */ - if ((iptype == IPA_IP_v6) && (active_v6 == true)) - { - if (num_firewall_v6 > IPACM_MAX_FIREWALL_ENTRIES) - { - IPACMERR("the number of v6 firewall entries overflow, aborting...\n"); - return IPACM_FAILURE; - } - if (num_firewall_v6 != 0) - { - if (m_filtering.DeleteFilteringHdls(firewall_hdl_v6, - IPA_IP_v6, num_firewall_v6) == false) - { - IPACMERR("Error Deleting Filtering rules, aborting...\n"); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_firewall_v6); - } - else - { - IPACMDBG_H("No ipv6 firewall rules, no need deleted\n"); - } - - if (m_filtering.DeleteFilteringHdls(&dft_wan_fl_hdl[1], - IPA_IP_v6, 1) == false) - { - IPACMERR("Error Deleting Filtering rules, aborting...\n"); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - if (m_filtering.DeleteFilteringHdls(&dft_wan_fl_hdl[2], - IPA_IP_v6, 1) == false) - { - IPACMERR("Error Deleting Filtering rules, aborting...\n"); - return IPACM_FAILURE; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - - if (is_ipv6_frag_firewall_flt_rule_installed && - check_dft_firewall_rules_attr_mask(&firewall_config)) - { - if (m_filtering.DeleteFilteringHdls(&ipv6_frag_firewall_flt_rule_hdl, IPA_IP_v6, 1) == false) - { - IPACMERR("Error deleting IPv6 frag filtering rules.\n"); - return IPACM_FAILURE; - } - is_ipv6_frag_firewall_flt_rule_installed = false; - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, 1); - } - num_firewall_v6 = 0; - } - - return IPACM_SUCCESS; -} - -/* for STA mode: wan default route/filter rule delete */ -int IPACM_Wan::handle_route_del_evt(ipa_ip_type iptype) -{ - uint32_t tx_index; - ipacm_cmd_q_data evt_data; - - IPACMDBG_H("got handle_route_del_evt for STA-mode with ip-family:%d \n", iptype); - - if(tx_prop == NULL) - { - IPACMDBG_H("No tx properties, ignore delete default route setting\n"); - return IPACM_SUCCESS; - } - - is_default_gateway = false; - IPACMDBG_H("Default route is deleted to iface %s.\n", dev_name); - - if (((iptype == IPA_IP_v4) && (active_v4 == true)) || - ((iptype == IPA_IP_v6) && (active_v6 == true))) - { - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if(iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d, no RT-rule deleted\n", - tx_index, tx_prop->tx[tx_index].ip,iptype); - continue; - } - - if (iptype == IPA_IP_v4) - { - IPACMDBG_H("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", tx_index, tx_prop->tx[tx_index].ip,iptype); - - if (m_routing.DeleteRoutingHdl(wan_route_rule_v4_hdl[tx_index], IPA_IP_v4) == false) - { - IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v4, wan_route_rule_v4_hdl[tx_index], tx_index); - return IPACM_FAILURE; - } - } - else - { - IPACMDBG_H("Tx:%d, ip-type: %d match ip-type: %d, RT-rule deleted\n", tx_index, tx_prop->tx[tx_index].ip,iptype); - - if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl[tx_index], IPA_IP_v6) == false) - { - IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed with tx_index %d!\n", IPA_IP_v6, wan_route_rule_v6_hdl[tx_index], tx_index); - return IPACM_FAILURE; - } - } - } - - /* Delete the default wan route*/ - if (iptype == IPA_IP_v6) - { - IPACMDBG_H("ip-type %d: default v6 wan RT-rule deleted\n",iptype); - if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false) - { - IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]); - return IPACM_FAILURE; - } - } - ipacm_event_iface_up *wandown_data; - wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up)); - if (wandown_data == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return IPACM_FAILURE; - } - memset(wandown_data, 0, sizeof(ipacm_event_iface_up)); - - if (iptype == IPA_IP_v4) - { - wandown_data->ipv4_addr = wan_v4_addr; - if (m_is_sta_mode!=Q6_WAN) - { - wandown_data->is_sta = true; - } - else - { - wandown_data->is_sta = false; - } - evt_data.event = IPA_HANDLE_WAN_DOWN; - evt_data.evt_data = (void *)wandown_data; - /* Insert IPA_HANDLE_WAN_DOWN to command queue */ - IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN for IPv4 (%d.%d.%d.%d) \n", - (unsigned char)(wandown_data->ipv4_addr), - (unsigned char)(wandown_data->ipv4_addr >> 8), - (unsigned char)(wandown_data->ipv4_addr >> 16), - (unsigned char)(wandown_data->ipv4_addr >> 24)); - - IPACM_EvtDispatcher::PostEvt(&evt_data); - IPACMDBG_H("setup wan_up/active_v4= false \n"); - IPACM_Wan::wan_up = false; - active_v4 = false; - if(IPACM_Wan::wan_up_v6) - { - IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name); - } - else - { - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - } - } - else - { - if (m_is_sta_mode!=Q6_WAN) - { - wandown_data->is_sta = true; - } - else - { - wandown_data->is_sta = false; - } - memcpy(wandown_data->ipv6_prefix, ipv6_prefix, sizeof(wandown_data->ipv6_prefix)); - evt_data.event = IPA_HANDLE_WAN_DOWN_V6; - evt_data.evt_data = (void *)wandown_data; - /* Insert IPA_HANDLE_WAN_DOWN to command queue */ - IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN for IPv6 with prefix 0x%08x%08x\n", ipv6_prefix[0], ipv6_prefix[1]); - IPACM_EvtDispatcher::PostEvt(&evt_data); - IPACMDBG_H("setup wan_up_v6/active_v6= false \n"); - IPACM_Wan::wan_up_v6 = false; - active_v6 = false; - if(IPACM_Wan::wan_up) - { - IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name); - } - else - { - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - } - } - } - else - { - IPACMDBG_H(" The default WAN routing rules are deleted already \n"); - } - - return IPACM_SUCCESS; -} - -int IPACM_Wan::handle_route_del_evt_ex(ipa_ip_type iptype) -{ - ipacm_cmd_q_data evt_data; - - IPACMDBG_H("got handle_route_del_evt_ex with ip-family:%d \n", iptype); - - if(tx_prop == NULL) - { - IPACMDBG_H("No tx properties, ignore delete default route setting\n"); - return IPACM_SUCCESS; - } - - is_default_gateway = false; - IPACMDBG_H("Default route is deleted to iface %s.\n", dev_name); - - if (((iptype == IPA_IP_v4) && (active_v4 == true)) || - ((iptype == IPA_IP_v6) && (active_v6 == true))) - { - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - - /* Delete the default route*/ - if (iptype == IPA_IP_v6) - { - IPACMDBG_H("ip-type %d: default v6 wan RT-rule deleted\n",iptype); - if (m_routing.DeleteRoutingHdl(wan_route_rule_v6_hdl_a5[0], IPA_IP_v6) == false) - { - IPACMDBG_H("IP-family:%d, Routing rule(hdl:0x%x) deletion failed!\n",IPA_IP_v6,wan_route_rule_v6_hdl_a5[0]); - return IPACM_FAILURE; - } - } - - ipacm_event_iface_up *wandown_data; - wandown_data = (ipacm_event_iface_up *)malloc(sizeof(ipacm_event_iface_up)); - if (wandown_data == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return IPACM_FAILURE; - } - memset(wandown_data, 0, sizeof(ipacm_event_iface_up)); - - if (iptype == IPA_IP_v4) - { - wandown_data->ipv4_addr = wan_v4_addr; - if (m_is_sta_mode!=Q6_WAN) - { - wandown_data->is_sta = true; - } - else - { - wandown_data->is_sta = false; - } - evt_data.event = IPA_HANDLE_WAN_DOWN; - evt_data.evt_data = (void *)wandown_data; - /* Insert IPA_HANDLE_WAN_DOWN to command queue */ - IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN for IPv4 with address: 0x%x\n", wan_v4_addr); - IPACM_EvtDispatcher::PostEvt(&evt_data); - - IPACMDBG_H("setup wan_up/active_v4= false \n"); - IPACM_Wan::wan_up = false; - active_v4 = false; - if(IPACM_Wan::wan_up_v6) - { - IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name); - } - else - { - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - } - } - else - { - if (m_is_sta_mode!=Q6_WAN) - { - wandown_data->is_sta = true; - } - else - { - wandown_data->is_sta = false; - } - memcpy(wandown_data->ipv6_prefix, ipv6_prefix, sizeof(wandown_data->ipv6_prefix)); - evt_data.event = IPA_HANDLE_WAN_DOWN_V6; - evt_data.evt_data = (void *)wandown_data; - IPACMDBG_H("posting IPA_HANDLE_WAN_DOWN_V6 for IPv6 with prefix 0x%08x%08x\n", ipv6_prefix[0], ipv6_prefix[1]); - IPACM_EvtDispatcher::PostEvt(&evt_data); - - IPACMDBG_H("setup wan_up_v6/active_v6= false \n"); - IPACM_Wan::wan_up_v6 = false; - active_v6 = false; - if(IPACM_Wan::wan_up) - { - IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name); - } - else - { - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - } - } - } - else - { - IPACMDBG_H(" The default WAN routing rules are deleted already \n"); - } - - return IPACM_SUCCESS; -} - -/* configure the initial embms filter rules */ -int IPACM_Wan::config_dft_embms_rules(ipa_ioc_add_flt_rule *pFilteringTable_v4, ipa_ioc_add_flt_rule *pFilteringTable_v6) -{ - struct ipa_flt_rule_add flt_rule_entry; - struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx; - struct ipa_ioc_generate_flt_eq flt_eq; - - if (rx_prop == NULL) - { - IPACMDBG("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - if(pFilteringTable_v4 == NULL || pFilteringTable_v6 == NULL) - { - IPACMERR("Either v4 or v6 filtering table is empty.\n"); - return IPACM_FAILURE; - } - - /* set up ipv4 odu rule*/ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - - /* get eMBMS ODU tbl index*/ - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v4.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = IPA_IP_v4; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - IPACMDBG_H("Odu routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.at_rear = false; - - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v4.dst_addr_mask = 0x00000000; - flt_rule_entry.rule.attrib.u.v4.dst_addr = 0x00000000; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = IPA_IP_v4; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(pFilteringTable_v4->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - /* construc v6 rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - /* get eMBMS ODU tbl*/ - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_odu_v6.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = IPA_IP_v6; - if(0 != ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx)) - { - IPACMERR("Failed to get routing table index from name\n"); - return IPACM_FAILURE; - } - IPACMDBG_H("Odu routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.at_rear = false; - - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(struct ipa_rule_attrib)); - flt_rule_entry.rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[0] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr_mask[3] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[0] = 0X00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[1] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[2] = 0x00000000; - flt_rule_entry.rule.attrib.u.v6.dst_addr[3] = 0X00000000; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = IPA_IP_v6; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - return IPACM_FAILURE; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - - memcpy(&(pFilteringTable_v6->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - return IPACM_SUCCESS; -} - - -/*for STA mode: handle wan-iface down event */ -int IPACM_Wan::handle_down_evt() -{ - int res = IPACM_SUCCESS; - int i, tether_total; - int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES]; - - IPACMDBG_H(" wan handle_down_evt \n"); - - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) - { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - } - - /* no iface address up, directly close iface*/ - if (ip_type == IPACM_IP_NULL) - { - goto fail; - } - - /* make sure default routing rules and firewall rules are deleted*/ - if (active_v4) - { - if (rx_prop != NULL) - { - del_dft_firewall_rules(IPA_IP_v4); - } - handle_route_del_evt(IPA_IP_v4); - IPACMDBG_H("Delete default v4 routing rules\n"); -#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN - /* posting wan_down_tether for all lan clients */ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++) - { - ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i]; - } - tether_total = IPACM_Wan::ipa_if_num_tether_v4_total; - for (i=0; i < tether_total; i++) - { - post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]); - IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n", i, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name); - } -#endif - } - - if (active_v6) - { - if (rx_prop != NULL) - { - del_dft_firewall_rules(IPA_IP_v6); - } - handle_route_del_evt(IPA_IP_v6); - IPACMDBG_H("Delete default v6 routing rules\n"); -#ifdef IPA_WAN_MSG_IPv6_ADDR_GW_LEN - /* posting wan_down_tether for all lan clients */ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++) - { - ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i]; - } - tether_total = IPACM_Wan::ipa_if_num_tether_v6_total; - for (i=0; i < tether_total; i++) - { - post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]); - IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n", i, - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name); - } -#endif - } - - /* Delete default v4 RT rule */ - if (ip_type != IPA_IP_v6) - { - IPACMDBG_H("Delete default v4 routing rules\n"); - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - - /* delete default v6 RT rule */ - if (ip_type != IPA_IP_v4) - { - IPACMDBG_H("Delete default v6 routing rules\n"); - /* May have multiple ipv6 iface-routing rules*/ - for (i = 0; i < 2*num_dft_rt_v6; i++) - { - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - - IPACMDBG_H("finished delete default v6 RT rules\n "); - } - - - /* clean wan-client header, routing rules */ - IPACMDBG_H("left %d wan clients need to be deleted \n ", num_wan_client); - for (i = 0; i < num_wan_client; i++) - { - /* Del NAT rules before ipv4 RT rules are delete */ - if(get_client_memptr(wan_client, i)->ipv4_set == true) - { - IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wan_client, i)->v4_addr); - CtList->HandleSTAClientDelEvt(get_client_memptr(wan_client, i)->v4_addr); - } - - if (delete_wan_rtrules(i, IPA_IP_v4)) - { - IPACMERR("unbale to delete wan-client v4 route rules for index %d\n", i); - res = IPACM_FAILURE; - goto fail; - } - - if (delete_wan_rtrules(i, IPA_IP_v6)) - { - IPACMERR("unbale to delete ecm-client v6 route rules for index %d\n", i); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("Delete %d client header\n", num_wan_client); - - - if(get_client_memptr(wan_client, i)->ipv4_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(wan_client, i)->hdr_hdl_v4) - == false) - { - res = IPACM_FAILURE; - goto fail; - } - } - - if(get_client_memptr(wan_client, i)->ipv6_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(wan_client, i)->hdr_hdl_v6) - == false) - { - res = IPACM_FAILURE; - goto fail; - } - } - } /* end of for loop */ - - /* free the edm clients cache */ - IPACMDBG_H("Free wan clients cache\n"); - - /* check software routing fl rule hdl */ - if (softwarerouting_act == true) - { - handle_software_routing_disable(); - } - - /* free filter rule handlers */ - if (ip_type != IPA_IP_v6 && rx_prop != NULL) - { - if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl, - IPA_IP_v4, - IPV4_DEFAULT_FILTERTING_RULES) == false) - { - IPACMERR("Error Delete Filtering rules, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES); - - IPACMDBG_H("finished delete default v4 filtering rules\n "); - } - - - if (ip_type != IPA_IP_v4 && rx_prop != NULL) - { - if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl, - IPA_IP_v6, - IPV6_DEFAULT_FILTERTING_RULES) == false) - { - IPACMERR("ErrorDeleting Filtering rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES); - - if(num_ipv6_dest_flt_rule > 0 && num_ipv6_dest_flt_rule <= MAX_DEFAULT_v6_ROUTE_RULES) - { - if(m_filtering.DeleteFilteringHdls(ipv6_dest_flt_rule_hdl, IPA_IP_v6, num_ipv6_dest_flt_rule) == false) - { - IPACMERR("Failed to delete ipv6 dest flt rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, num_ipv6_dest_flt_rule); - } - IPACMDBG_H("finished delete default v6 filtering rules\n "); - } - if(hdr_proc_hdl_dummy_v6) - { - if(m_header.DeleteHeaderProcCtx(hdr_proc_hdl_dummy_v6) == false) - { - IPACMERR("Failed to delete hdr_proc_hdl_dummy_v6\n"); - res = IPACM_FAILURE; - goto fail; - } - } - if(hdr_hdl_dummy_v6) - { - if (m_header.DeleteHeaderHdl(hdr_hdl_dummy_v6) == false) - { - IPACMERR("Failed to delete hdr_hdl_dummy_v6\n"); - res = IPACM_FAILURE; - goto fail; - } - } -fail: - if (tx_prop != NULL) - { - free(tx_prop); - } - if (rx_prop != NULL) - { - free(rx_prop); - } - if (iface_query != NULL) - { - free(iface_query); - } - if (wan_route_rule_v4_hdl != NULL) - { - free(wan_route_rule_v4_hdl); - } - if (wan_route_rule_v6_hdl != NULL) - { - free(wan_route_rule_v6_hdl); - } - if (wan_route_rule_v6_hdl_a5 != NULL) - { - free(wan_route_rule_v6_hdl_a5); - } - if (wan_client != NULL) - { - free(wan_client); - } - close(m_fd_ipa); - return res; -} - -int IPACM_Wan::handle_down_evt_ex() -{ - int res = IPACM_SUCCESS; - int i, tether_total; - int ipa_if_num_tether_tmp[IPA_MAX_IFACE_ENTRIES]; - - IPACMDBG_H(" wan handle_down_evt \n"); - - /* free ODU filter rule handlers */ - if(IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == EMBMS_IF) - { - embms_is_on = false; - /* Delete corresponding ipa_rm_resource_name of TX-endpoint after delete IPV4/V6 RT-rule */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - if (tx_prop != NULL) - { - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - } - - if (rx_prop != NULL) - { - install_wan_filtering_rule(false); - IPACMDBG("finished delete embms filtering rule\n "); - } - goto fail; - } - - /* no iface address up, directly close iface*/ - if (ip_type == IPACM_IP_NULL) - { - goto fail; - } - - if(ip_type == IPA_IP_v4) - { - num_ipv4_modem_pdn--; - IPACMDBG_H("Now the number of ipv4 modem pdn is %d.\n", num_ipv4_modem_pdn); - /* only when default gw goes down we post WAN_DOWN event*/ - if(is_default_gateway == true) - { - IPACM_Wan::wan_up = false; - del_wan_firewall_rule(IPA_IP_v4); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v4); -#ifdef FEATURE_IPA_ANDROID - /* posting wan_down_tether for all lan clients */ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++) - { - ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i]; - } - tether_total = IPACM_Wan::ipa_if_num_tether_v4_total; - for (i=0; i < tether_total; i++) - { - post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]); - IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n", - i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name); - } -#endif - if(IPACM_Wan::wan_up_v6) - { - IPACMDBG_H("modem v6-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name); - } - else - { - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - } - } - - /* only when the last ipv4 modem interface goes down, delete ipv4 default flt rules*/ - if(num_ipv4_modem_pdn == 0) - { - IPACMDBG_H("Now the number of modem ipv4 interface is 0, delete default flt rules.\n"); - IPACM_Wan::num_v4_flt_rule = 0; - memset(IPACM_Wan::flt_rule_v4, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add)); - install_wan_filtering_rule(false); - } - - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - else if(ip_type == IPA_IP_v6) - { - if (num_dft_rt_v6 > 1) - num_ipv6_modem_pdn--; - IPACMDBG_H("Now the number of ipv6 modem pdn is %d.\n", num_ipv6_modem_pdn); - /* only when default gw goes down we post WAN_DOWN event*/ - if(is_default_gateway == true) - { - IPACM_Wan::wan_up_v6 = false; - del_wan_firewall_rule(IPA_IP_v6); - install_wan_filtering_rule(false); - handle_route_del_evt_ex(IPA_IP_v6); -#ifdef FEATURE_IPA_ANDROID //sky - /* posting wan_down_tether for all lan clients */ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++) - { - ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i]; - } - tether_total = IPACM_Wan::ipa_if_num_tether_v6_total; - for (i=0; i < tether_total; i++) - { - post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]); - IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n", - i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name); - } -#endif - if(IPACM_Wan::wan_up) - { - IPACMDBG_H("modem v4-call still up(%s), not reset\n", IPACM_Wan::wan_up_dev_name); - } - else - { - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - } - } - - /* only when the last ipv6 modem interface goes down, delete ipv6 default flt rules*/ - if(num_ipv6_modem_pdn == 0) - { - IPACMDBG_H("Now the number of modem ipv6 interface is 0, delete default flt rules.\n"); - IPACM_Wan::num_v6_flt_rule = 0; - memset(IPACM_Wan::flt_rule_v6, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add)); - install_wan_filtering_rule(false); - } - - for (i = 0; i < 2*num_dft_rt_v6; i++) - { - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - } - else - { - num_ipv4_modem_pdn--; - IPACMDBG_H("Now the number of ipv4 modem pdn is %d.\n", num_ipv4_modem_pdn); - if (num_dft_rt_v6 > 1) - num_ipv6_modem_pdn--; - IPACMDBG_H("Now the number of ipv6 modem pdn is %d.\n", num_ipv6_modem_pdn); - /* only when default gw goes down we post WAN_DOWN event*/ - if(is_default_gateway == true) - { - IPACM_Wan::wan_up = false; - del_wan_firewall_rule(IPA_IP_v4); - handle_route_del_evt_ex(IPA_IP_v4); -#ifdef FEATURE_IPA_ANDROID - /* posting wan_down_tether for all lan clients */ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v4_total; i++) - { - ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v4[i]; - } - tether_total = IPACM_Wan::ipa_if_num_tether_v4_total; - for (i=0; i < tether_total; i++) - { - post_wan_down_tether_evt(IPA_IP_v4, ipa_if_num_tether_tmp[i]); - IPACMDBG_H("post_wan_down_tether_v4 iface(%d: %s)\n", - i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name); - } -#endif - IPACM_Wan::wan_up_v6 = false; - del_wan_firewall_rule(IPA_IP_v6); - handle_route_del_evt_ex(IPA_IP_v6); -#ifdef FEATURE_IPA_ANDROID - /* posting wan_down_tether for all lan clients */ - for (i=0; i < IPACM_Wan::ipa_if_num_tether_v6_total; i++) - { - ipa_if_num_tether_tmp[i] = IPACM_Wan::ipa_if_num_tether_v6[i]; - } - tether_total = IPACM_Wan::ipa_if_num_tether_v6_total; - for (i=0; i < tether_total; i++) - { - post_wan_down_tether_evt(IPA_IP_v6, ipa_if_num_tether_tmp[i]); - IPACMDBG_H("post_wan_down_tether_v6 iface(%d: %s)\n", - i, IPACM_Iface::ipacmcfg->iface_table[ipa_if_num_tether_tmp[i]].iface_name); - } -#endif - memset(IPACM_Wan::wan_up_dev_name, 0, sizeof(IPACM_Wan::wan_up_dev_name)); - - install_wan_filtering_rule(false); - } - - /* only when the last ipv4 modem interface goes down, delete ipv4 default flt rules*/ - if(num_ipv4_modem_pdn == 0) - { - IPACMDBG_H("Now the number of modem ipv4 interface is 0, delete default flt rules.\n"); - IPACM_Wan::num_v4_flt_rule = 0; - memset(IPACM_Wan::flt_rule_v4, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add)); - install_wan_filtering_rule(false); - } - /* only when the last ipv6 modem interface goes down, delete ipv6 default flt rules*/ - if(num_ipv6_modem_pdn == 0) - { - IPACMDBG_H("Now the number of modem ipv6 interface is 0, delete default flt rules.\n"); - IPACM_Wan::num_v6_flt_rule = 0; - memset(IPACM_Wan::flt_rule_v6, 0, IPA_MAX_FLT_RULE * sizeof(struct ipa_flt_rule_add)); - install_wan_filtering_rule(false); - } - - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - - for (i = 0; i < 2*num_dft_rt_v6; i++) - { - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - } - - /* check software routing fl rule hdl */ - if (softwarerouting_act == true) - { - handle_software_routing_disable(); - } - -fail: - if (tx_prop != NULL) - { - free(tx_prop); - } - if (rx_prop != NULL) - { - free(rx_prop); - } - if (ext_prop != NULL) - { - free(ext_prop); - } - if (iface_query != NULL) - { - free(iface_query); - } - if (wan_route_rule_v4_hdl != NULL) - { - free(wan_route_rule_v4_hdl); - } - if (wan_route_rule_v6_hdl != NULL) - { - free(wan_route_rule_v6_hdl); - } - if (wan_route_rule_v6_hdl_a5 != NULL) - { - free(wan_route_rule_v6_hdl_a5); - } - if (wan_client != NULL) - { - free(wan_client); - } - close(m_fd_ipa); - return res; -} - -int IPACM_Wan::install_wan_filtering_rule(bool is_sw_routing) -{ - int len, res = IPACM_SUCCESS; - uint8_t mux_id; - ipa_ioc_add_flt_rule *pFilteringTable_v4 = NULL; - ipa_ioc_add_flt_rule *pFilteringTable_v6 = NULL; - - mux_id = IPACM_Iface::ipacmcfg->GetQmapId(); - if(rx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - if (is_sw_routing == true || - IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true) - { - /* contruct SW-RT rules to Q6*/ - struct ipa_flt_rule_add flt_rule_entry; - struct ipa_ioc_get_rt_tbl_indx rt_tbl_idx; - ipa_ioc_generate_flt_eq flt_eq; - - IPACMDBG("\n"); - if (softwarerouting_act == true) - { - IPACMDBG("already setup software_routing rule for (%s)iface ip-family %d\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ip_type); - return IPACM_SUCCESS; - } - - len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); - pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len); - if (pFilteringTable_v4 == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable_v4, 0, len); - IPACMDBG_H("Total number of WAN DL filtering rule for IPv4 is 1\n"); - - pFilteringTable_v4->commit = 1; - pFilteringTable_v4->ep = rx_prop->rx[0].src_pipe; - pFilteringTable_v4->global = false; - pFilteringTable_v4->ip = IPA_IP_v4; - pFilteringTable_v4->num_rules = (uint8_t)1; - - /* Configuring Software-Routing Filtering Rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = IPA_IP_v4; - if(ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx) < 0) - { - IPACMERR("Failed to get routing table index from name\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - flt_rule_entry.at_rear = false; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = IPA_IP_v4; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(pFilteringTable_v4->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - - len = sizeof(struct ipa_ioc_add_flt_rule) + sizeof(struct ipa_flt_rule_add); - pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len); - if (pFilteringTable_v6 == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - free(pFilteringTable_v4); - return IPACM_FAILURE; - } - memset(pFilteringTable_v6, 0, len); - IPACMDBG_H("Total number of WAN DL filtering rule for IPv6 is 1\n"); - - pFilteringTable_v6->commit = 1; - pFilteringTable_v6->ep = rx_prop->rx[0].src_pipe; - pFilteringTable_v6->global = false; - pFilteringTable_v6->ip = IPA_IP_v6; - pFilteringTable_v6->num_rules = (uint8_t)1; - - /* Configuring Software-Routing Filtering Rule */ - memset(&flt_rule_entry, 0, sizeof(struct ipa_flt_rule_add)); - memset(&rt_tbl_idx, 0, sizeof(rt_tbl_idx)); - strlcpy(rt_tbl_idx.name, IPACM_Iface::ipacmcfg->rt_tbl_wan_dl.name, IPA_RESOURCE_NAME_MAX); - rt_tbl_idx.name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - rt_tbl_idx.ip = IPA_IP_v6; - if(ioctl(m_fd_ipa, IPA_IOC_QUERY_RT_TBL_INDEX, &rt_tbl_idx) < 0) - { - IPACMERR("Failed to get routing table index from name\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACMDBG_H("Routing table %s has index %d\n", rt_tbl_idx.name, rt_tbl_idx.idx); - - flt_rule_entry.at_rear = false; - flt_rule_entry.flt_rule_hdl = -1; - flt_rule_entry.status = -1; - flt_rule_entry.rule.action = IPA_PASS_TO_ROUTING; -#ifdef FEATURE_IPA_V3 - flt_rule_entry.rule.hashable = true; -#endif - flt_rule_entry.rule.rt_tbl_idx = rt_tbl_idx.idx; - memcpy(&flt_rule_entry.rule.attrib, - &rx_prop->rx[0].attrib, - sizeof(flt_rule_entry.rule.attrib)); - flt_rule_entry.rule.retain_hdr = 0; - flt_rule_entry.rule.to_uc = 0; - flt_rule_entry.rule.eq_attrib_type = 1; - - memset(&flt_eq, 0, sizeof(flt_eq)); - memcpy(&flt_eq.attrib, &flt_rule_entry.rule.attrib, sizeof(flt_eq.attrib)); - flt_eq.ip = IPA_IP_v6; - if(0 != ioctl(m_fd_ipa, IPA_IOC_GENERATE_FLT_EQ, &flt_eq)) - { - IPACMERR("Failed to get eq_attrib\n"); - res = IPACM_FAILURE; - goto fail; - } - memcpy(&flt_rule_entry.rule.eq_attrib, - &flt_eq.eq_attrib, - sizeof(flt_rule_entry.rule.eq_attrib)); - memcpy(&(pFilteringTable_v6->rules[0]), &flt_rule_entry, sizeof(struct ipa_flt_rule_add)); - softwarerouting_act = true; - /* end of contruct SW-RT rules to Q6*/ - } - else - { - if(embms_is_on == false) - { - if(IPACM_Wan::num_v4_flt_rule > 0) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + IPACM_Wan::num_v4_flt_rule * sizeof(struct ipa_flt_rule_add); - pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len); - - IPACMDBG_H("Total number of WAN DL filtering rule for IPv4 is %d\n", IPACM_Wan::num_v4_flt_rule); - - if (pFilteringTable_v4 == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable_v4, 0, len); - pFilteringTable_v4->commit = 1; - pFilteringTable_v4->ep = rx_prop->rx[0].src_pipe; - pFilteringTable_v4->global = false; - pFilteringTable_v4->ip = IPA_IP_v4; - pFilteringTable_v4->num_rules = (uint8_t)IPACM_Wan::num_v4_flt_rule; - - memcpy(pFilteringTable_v4->rules, IPACM_Wan::flt_rule_v4, IPACM_Wan::num_v4_flt_rule * sizeof(ipa_flt_rule_add)); - } - - if(IPACM_Wan::num_v6_flt_rule > 0) - { - len = sizeof(struct ipa_ioc_add_flt_rule) + IPACM_Wan::num_v6_flt_rule * sizeof(struct ipa_flt_rule_add); - pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len); - - IPACMDBG_H("Total number of WAN DL filtering rule for IPv6 is %d\n", IPACM_Wan::num_v6_flt_rule); - - if (pFilteringTable_v6 == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - free(pFilteringTable_v4); - return IPACM_FAILURE; - } - memset(pFilteringTable_v6, 0, len); - pFilteringTable_v6->commit = 1; - pFilteringTable_v6->ep = rx_prop->rx[0].src_pipe; - pFilteringTable_v6->global = false; - pFilteringTable_v6->ip = IPA_IP_v6; - pFilteringTable_v6->num_rules = (uint8_t)IPACM_Wan::num_v6_flt_rule; - - memcpy(pFilteringTable_v6->rules, IPACM_Wan::flt_rule_v6, IPACM_Wan::num_v6_flt_rule * sizeof(ipa_flt_rule_add)); - } - } - else //embms is on, always add 1 embms rule on top of WAN DL flt table - { - /* allocate ipv4 filtering table */ - len = sizeof(struct ipa_ioc_add_flt_rule) + (1 + IPACM_Wan::num_v4_flt_rule) * sizeof(struct ipa_flt_rule_add); - pFilteringTable_v4 = (struct ipa_ioc_add_flt_rule*)malloc(len); - IPACMDBG_H("Total number of WAN DL filtering rule for IPv4 is %d\n", IPACM_Wan::num_v4_flt_rule + 1); - if (pFilteringTable_v4 == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - return IPACM_FAILURE; - } - memset(pFilteringTable_v4, 0, len); - pFilteringTable_v4->commit = 1; - pFilteringTable_v4->ep = rx_prop->rx[0].src_pipe; - pFilteringTable_v4->global = false; - pFilteringTable_v4->ip = IPA_IP_v4; - pFilteringTable_v4->num_rules = (uint8_t)IPACM_Wan::num_v4_flt_rule + 1; - - /* allocate ipv6 filtering table */ - len = sizeof(struct ipa_ioc_add_flt_rule) + (1 + IPACM_Wan::num_v6_flt_rule) * sizeof(struct ipa_flt_rule_add); - pFilteringTable_v6 = (struct ipa_ioc_add_flt_rule*)malloc(len); - IPACMDBG_H("Total number of WAN DL filtering rule for IPv6 is %d\n", IPACM_Wan::num_v6_flt_rule + 1); - if (pFilteringTable_v6 == NULL) - { - IPACMERR("Error Locate ipa_flt_rule_add memory...\n"); - free(pFilteringTable_v4); - return IPACM_FAILURE; - } - memset(pFilteringTable_v6, 0, len); - pFilteringTable_v6->commit = 1; - pFilteringTable_v6->ep = rx_prop->rx[0].src_pipe; - pFilteringTable_v6->global = false; - pFilteringTable_v6->ip = IPA_IP_v6; - pFilteringTable_v6->num_rules = (uint8_t)IPACM_Wan::num_v6_flt_rule + 1; - - config_dft_embms_rules(pFilteringTable_v4, pFilteringTable_v6); - if(IPACM_Wan::num_v4_flt_rule > 0) - { - memcpy(&(pFilteringTable_v4->rules[1]), IPACM_Wan::flt_rule_v4, IPACM_Wan::num_v4_flt_rule * sizeof(ipa_flt_rule_add)); - } - - if(IPACM_Wan::num_v6_flt_rule > 0) - { - memcpy(&(pFilteringTable_v6->rules[1]), IPACM_Wan::flt_rule_v6, IPACM_Wan::num_v6_flt_rule * sizeof(ipa_flt_rule_add)); - } - } - } - - if(false == m_filtering.AddWanDLFilteringRule(pFilteringTable_v4, pFilteringTable_v6, mux_id)) - { - IPACMERR("Failed to install WAN DL filtering table.\n"); - res = IPACM_FAILURE; - goto fail; - } - -fail: - if(pFilteringTable_v4 != NULL) - { - free(pFilteringTable_v4); - } - if(pFilteringTable_v6 != NULL) - { - free(pFilteringTable_v6); - } - return res; -} - -void IPACM_Wan::change_to_network_order(ipa_ip_type iptype, ipa_rule_attrib* attrib) -{ - if(attrib == NULL) - { - IPACMERR("Attribute pointer is NULL.\n"); - return; - } - - if(iptype == IPA_IP_v6) - { - int i; - for(i=0; i<4; i++) - { - attrib->u.v6.src_addr[i] = htonl(attrib->u.v6.src_addr[i]); - attrib->u.v6.src_addr_mask[i] = htonl(attrib->u.v6.src_addr_mask[i]); - attrib->u.v6.dst_addr[i] = htonl(attrib->u.v6.dst_addr[i]); - attrib->u.v6.dst_addr_mask[i] = htonl(attrib->u.v6.dst_addr_mask[i]); - } - } - else - { - IPACMDBG_H("IP type is not IPv6, do nothing: %d\n", iptype); - } - - return; -} - -bool IPACM_Wan::is_global_ipv6_addr(uint32_t* ipv6_addr) -{ - if(ipv6_addr == NULL) - { - IPACMERR("IPv6 address is empty.\n"); - return false; - } - IPACMDBG_H("Get ipv6 address with first word 0x%08x.\n", ipv6_addr[0]); - - uint32_t ipv6_link_local_prefix, ipv6_link_local_prefix_mask; - ipv6_link_local_prefix = 0xFE800000; - ipv6_link_local_prefix_mask = 0xFFC00000; - if((ipv6_addr[0] & ipv6_link_local_prefix_mask) == (ipv6_link_local_prefix & ipv6_link_local_prefix_mask)) - { - IPACMDBG_H("This IPv6 address is link local.\n"); - return false; - } - else - { - IPACMDBG_H("This IPv6 address is not link local.\n"); - return true; - } -} - -/* handle STA WAN-client */ -/* handle WAN client initial, construct full headers (tx property) */ -int IPACM_Wan::handle_wan_hdr_init(uint8_t *mac_addr) -{ - -#define WAN_IFACE_INDEX_LEN 2 - - int res = IPACM_SUCCESS, len = 0; - char index[WAN_IFACE_INDEX_LEN]; - struct ipa_ioc_copy_hdr sCopyHeader; - struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL; - uint32_t cnt; - int clnt_indx; - - clnt_indx = get_wan_client_index(mac_addr); - - if (clnt_indx != IPACM_INVALID_INDEX) - { - IPACMERR("eth client is found/attached already with index %d \n", clnt_indx); - return IPACM_FAILURE; - } - - /* add header to IPA */ - if (num_wan_client >= IPA_MAX_NUM_WAN_CLIENTS) - { - IPACMERR("Reached maximum number(%d) of eth clients\n", IPA_MAX_NUM_WAN_CLIENTS); - return IPACM_FAILURE; - } - - IPACMDBG_H("WAN client number: %d\n", num_wan_client); - - memcpy(get_client_memptr(wan_client, num_wan_client)->mac, - mac_addr, - sizeof(get_client_memptr(wan_client, num_wan_client)->mac)); - - IPACMDBG_H("Received Client MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - IPACMDBG_H("stored MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - get_client_memptr(wan_client, num_wan_client)->mac[0], - get_client_memptr(wan_client, num_wan_client)->mac[1], - get_client_memptr(wan_client, num_wan_client)->mac[2], - get_client_memptr(wan_client, num_wan_client)->mac[3], - get_client_memptr(wan_client, num_wan_client)->mac[4], - get_client_memptr(wan_client, num_wan_client)->mac[5]); - - /* add header to IPA */ - if(tx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add)); - pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len); - if (pHeaderDescriptor == NULL) - { - IPACMERR("calloc failed to allocate pHeaderDescriptor\n"); - return IPACM_FAILURE; - } - - /* copy partial header for v4*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v4) - { - IPACMDBG_H("Got partial v4-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - /* copy client mac_addr to partial header */ - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", - sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - - /* only copy 6 bytes mac-address */ - if(sCopyHeader.is_eth2_ofst_valid == false) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[0], - mac_addr, IPA_MAC_ADDR_SIZE); - } - else - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst], - mac_addr, IPA_MAC_ADDR_SIZE); - } - - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - snprintf(index,sizeof(index), "%d", header_name_count); - if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl; - IPACMDBG_H("eth-client(%d) v4 full header name:%s header handle:(0x%x)\n", - num_wan_client, - pHeaderDescriptor->hdr[0].name, - get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v4); - get_client_memptr(wan_client, num_wan_client)->ipv4_header_set=true; - - break; - } - } - - - /* copy partial header for v6*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v6) - { - - IPACMDBG_H("Got partial v6-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - /* copy client mac_addr to partial header */ - if(sCopyHeader.is_eth2_ofst_valid == false) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[0], - mac_addr, IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */ - } - else - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[sCopyHeader.eth2_ofst], - mac_addr, IPA_MAC_ADDR_SIZE); /* only copy 6 bytes mac-address */ - } - - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - snprintf(index,sizeof(index), "%d", header_name_count); - if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl; - IPACMDBG_H("eth-client(%d) v6 full header name:%s header handle:(0x%x)\n", - num_wan_client, - pHeaderDescriptor->hdr[0].name, - get_client_memptr(wan_client, num_wan_client)->hdr_hdl_v6); - - get_client_memptr(wan_client, num_wan_client)->ipv6_header_set=true; - - break; - - } - } - /* initialize wifi client*/ - get_client_memptr(wan_client, num_wan_client)->route_rule_set_v4 = false; - get_client_memptr(wan_client, num_wan_client)->route_rule_set_v6 = 0; - get_client_memptr(wan_client, num_wan_client)->ipv4_set = false; - get_client_memptr(wan_client, num_wan_client)->ipv6_set = 0; - num_wan_client++; - header_name_count++; //keep increasing header_name_count - res = IPACM_SUCCESS; - IPACMDBG_H("eth client number: %d\n", num_wan_client); - } - else - { - return res; - } -fail: - free(pHeaderDescriptor); - - return res; -} - -/*handle eth client */ -int IPACM_Wan::handle_wan_client_ipaddr(ipacm_event_data_all *data) -{ - int clnt_indx; - int v6_num; - - IPACMDBG_H("number of wan clients: %d\n", num_wan_client); - IPACMDBG_H(" event MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - data->mac_addr[0], - data->mac_addr[1], - data->mac_addr[2], - data->mac_addr[3], - data->mac_addr[4], - data->mac_addr[5]); - - clnt_indx = get_wan_client_index(data->mac_addr); - - if (clnt_indx == IPACM_INVALID_INDEX) - { - IPACMERR("wan client not found/attached \n"); - return IPACM_FAILURE; - } - - IPACMDBG_H("Ip-type received %d\n", data->iptype); - if (data->iptype == IPA_IP_v4) - { - IPACMDBG_H("ipv4 address: 0x%x\n", data->ipv4_addr); - if (data->ipv4_addr != 0) /* not 0.0.0.0 */ - { - if (get_client_memptr(wan_client, clnt_indx)->ipv4_set == false) - { - get_client_memptr(wan_client, clnt_indx)->v4_addr = data->ipv4_addr; - get_client_memptr(wan_client, clnt_indx)->ipv4_set = true; - /* Add NAT rules after ipv4 RT rules are set */ - CtList->HandleSTAClientAddEvt(data->ipv4_addr); - } - else - { - /* check if client got new IPv4 address*/ - if(data->ipv4_addr == get_client_memptr(wan_client, clnt_indx)->v4_addr) - { - IPACMDBG_H("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx); - return IPACM_FAILURE; - } - else - { - IPACMDBG_H("ipv4 addr for client:%d is changed \n", clnt_indx); - /* Del NAT rules before ipv4 RT rules are delete */ - CtList->HandleSTAClientDelEvt(get_client_memptr(wan_client, clnt_indx)->v4_addr); - delete_wan_rtrules(clnt_indx,IPA_IP_v4); - get_client_memptr(wan_client, clnt_indx)->route_rule_set_v4 = false; - get_client_memptr(wan_client, clnt_indx)->v4_addr = data->ipv4_addr; - /* Add NAT rules after ipv4 RT rules are set */ - CtList->HandleSTAClientAddEvt(data->ipv4_addr); - } - } - } - else - { - IPACMDBG_H("Invalid client IPv4 address \n"); - return IPACM_FAILURE; - } - } - else - { - if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */ - { - IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); - if(get_client_memptr(wan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR) - { - - for(v6_num=0;v6_num < get_client_memptr(wan_client, clnt_indx)->ipv6_set;v6_num++) - { - if( data->ipv6_addr[0] == get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][0] && - data->ipv6_addr[1] == get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][1] && - data->ipv6_addr[2]== get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][2] && - data->ipv6_addr[3] == get_client_memptr(wan_client, clnt_indx)->v6_addr[v6_num][3]) - { - IPACMDBG_H("Already see this ipv6 addr for client:%d\n", clnt_indx); - return IPACM_FAILURE; /* not setup the RT rules*/ - } - } - - /* not see this ipv6 before for wifi client*/ - get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0]; - get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1]; - get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2]; - get_client_memptr(wan_client, clnt_indx)->v6_addr[get_client_memptr(wan_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3]; - get_client_memptr(wan_client, clnt_indx)->ipv6_set++; - } - else - { - IPACMDBG_H("Already got 3 ipv6 addr for client:%d\n", clnt_indx); - return IPACM_FAILURE; /* not setup the RT rules*/ - } - } - } - - return IPACM_SUCCESS; -} - -/*handle wan client routing rule*/ -int IPACM_Wan::handle_wan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype) -{ - struct ipa_ioc_add_rt_rule *rt_rule; - struct ipa_rt_rule_add *rt_rule_entry; - uint32_t tx_index; - int wan_index,v6_num; - const int NUM = 1; - - if(tx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - IPACMDBG_H("Received mac_addr MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - wan_index = get_wan_client_index(mac_addr); - if (wan_index == IPACM_INVALID_INDEX) - { - IPACMDBG_H("wan client not found/attached \n"); - return IPACM_SUCCESS; - } - - if (iptype==IPA_IP_v4) { - IPACMDBG_H("wan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", wan_index, iptype, - get_client_memptr(wan_client, wan_index)->ipv4_set, - get_client_memptr(wan_client, wan_index)->route_rule_set_v4); - } else { - IPACMDBG_H("wan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", wan_index, iptype, - get_client_memptr(wan_client, wan_index)->ipv6_set, - get_client_memptr(wan_client, wan_index)->route_rule_set_v6); - } - - /* Add default routing rules if not set yet */ - if ((iptype == IPA_IP_v4 - && get_client_memptr(wan_client, wan_index)->route_rule_set_v4 == false - && get_client_memptr(wan_client, wan_index)->ipv4_set == true) - || (iptype == IPA_IP_v6 - && get_client_memptr(wan_client, wan_index)->route_rule_set_v6 < get_client_memptr(wan_client, wan_index)->ipv6_set - )) - { - - /* Add corresponding ipa_rm_resource_name of TX-endpoint up before IPV6 RT-rule set */ - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", tx_prop->tx[0].dst_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe]); - IPACM_Iface::ipacmcfg->AddRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[tx_prop->tx[0].dst_pipe],false); - - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_add)); - - if (rt_rule == NULL) - { - PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = (uint8_t)NUM; - rt_rule->ip = iptype; - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if(iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n", - tx_index, tx_prop->tx[tx_index].ip,iptype); - continue; - } - - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = 0; - - if (iptype == IPA_IP_v4) - { - IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", wan_index, - get_client_memptr(wan_client, wan_index)->v4_addr); - - IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n", - wan_index, - get_client_memptr(wan_client, wan_index)->hdr_hdl_v4); - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_wan_v4.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if (IPACM_Iface::ipacmcfg->isMCC_Mode == true) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, wan_index)->hdr_hdl_v4; - rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wan_client, wan_index)->v4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - /* copy ipv4 RT hdl */ - get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4 = - rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4, iptype); - } else { - - for(v6_num = get_client_memptr(wan_client, wan_index)->route_rule_set_v6;v6_num < get_client_memptr(wan_client, wan_index)->ipv6_set;v6_num++) - { - IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n", - wan_index, - get_client_memptr(wan_client, wan_index)->hdr_hdl_v6); - - /* v6 LAN_RT_TBL */ - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_v6.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - /* Uplink going to wan clients should go to IPA */ - if (IPACM_Iface::ipacmcfg->isMCC_Mode == true) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, wan_index)->hdr_hdl_v6;; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6[v6_num], iptype); - - /*Copy same rule to v6 WAN RT TBL*/ - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - /* Downlink traffic from Wan clients, should go exception */ - rt_rule_entry->rule.dst = iface_query->excp_pipe; - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.hdr_hdl = 0; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wan_client, wan_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wan_client, wan_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num], iptype); - } - } - - } /* end of for loop */ - - free(rt_rule); - - if (iptype == IPA_IP_v4) - { - get_client_memptr(wan_client, wan_index)->route_rule_set_v4 = true; - } - else - { - get_client_memptr(wan_client, wan_index)->route_rule_set_v6 = get_client_memptr(wan_client, wan_index)->ipv6_set; - } - } - - return IPACM_SUCCESS; -} - -/* TODO Handle wan client routing rules also */ -void IPACM_Wan::handle_wlan_SCC_MCC_switch(bool isSCCMode, ipa_ip_type iptype) -{ - struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL; - struct ipa_rt_rule_mdfy *rt_rule_entry; - uint32_t tx_index = 0; - - IPACMDBG("\n"); - if (tx_prop == NULL || is_default_gateway == false) - { - IPACMDBG_H("No tx properties or no default route set yet\n"); - return; - } - - const int NUM = tx_prop->num_tx_props; - - for (tx_index = 0; tx_index < tx_prop->num_tx_props; tx_index++) - { - if (tx_prop->tx[tx_index].ip != iptype) - { - IPACMDBG_H("Tx:%d, ip-type: %d ip-type not matching: %d Ignore\n", - tx_index, tx_prop->tx[tx_index].ip, iptype); - continue; - } - - if (rt_rule == NULL) - { - rt_rule = (struct ipa_ioc_mdfy_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_mdfy_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_mdfy)); - - if (rt_rule == NULL) - { - IPACMERR("Unable to allocate memory for modify rt rule\n"); - return; - } - IPACMDBG("Allocated memory for %d rules successfully\n", NUM); - - rt_rule->commit = 1; - rt_rule->num_rules = 0; - rt_rule->ip = iptype; - } - - rt_rule_entry = &rt_rule->rules[rt_rule->num_rules]; - - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - - if (iptype == IPA_IP_v4) - { - rt_rule_entry->rule.attrib.u.v4.dst_addr = 0; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0; - rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v4; - rt_rule_entry->rt_rule_hdl = wan_route_rule_v4_hdl[tx_index]; - } - else - { - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0; - - rt_rule_entry->rule.hdr_hdl = hdr_hdl_sta_v6; - rt_rule_entry->rt_rule_hdl = wan_route_rule_v6_hdl[tx_index]; - } - IPACMDBG_H("Header handle: 0x%x\n", rt_rule_entry->rule.hdr_hdl); - - if (isSCCMode) - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - else - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - - rt_rule->num_rules++; - } - - if (rt_rule != NULL) - { - - if (rt_rule->num_rules > 0) - { - if (false == m_routing.ModifyRoutingRule(rt_rule)) - { - IPACMERR("Routing rule modify failed!\n"); - free(rt_rule); - return; - } - - IPACMDBG("Routing rule modified successfully \n"); - } - - free(rt_rule); - } - - return; -} - -void IPACM_Wan::handle_wan_client_SCC_MCC_switch(bool isSCCMode, ipa_ip_type iptype) -{ - struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL; - struct ipa_rt_rule_mdfy *rt_rule_entry; - - uint32_t tx_index = 0, clnt_index =0; - int v6_num = 0; - const int NUM_RULES = 1; - - int size = sizeof(struct ipa_ioc_mdfy_rt_rule) + - NUM_RULES * sizeof(struct ipa_rt_rule_mdfy); - - IPACMDBG("\n"); - - if (tx_prop == NULL || is_default_gateway == false) - { - IPACMDBG_H("No tx properties or no default route set yet\n"); - return; - } - - rt_rule = (struct ipa_ioc_mdfy_rt_rule *)calloc(1, size); - if (rt_rule == NULL) - { - IPACMERR("Unable to allocate memory for modify rt rule\n"); - return; - } - - - for (clnt_index = 0; clnt_index < num_wan_client; clnt_index++) - { - if (iptype == IPA_IP_v4) - { - IPACMDBG_H("wan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", - clnt_index, iptype, - get_client_memptr(wan_client, clnt_index)->ipv4_set, - get_client_memptr(wan_client, clnt_index)->route_rule_set_v4); - - if( get_client_memptr(wan_client, clnt_index)->route_rule_set_v4 == false || - get_client_memptr(wan_client, clnt_index)->ipv4_set == false) - { - continue; - } - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if (iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d skip\n", - tx_index, tx_prop->tx[tx_index].ip, iptype); - continue; - } - - memset(rt_rule, 0, size); - rt_rule->commit = 1; - rt_rule->num_rules = NUM_RULES; - rt_rule->ip = iptype; - rt_rule_entry = &rt_rule->rules[0]; - - IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", clnt_index, - get_client_memptr(wan_client, clnt_index)->v4_addr); - - IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n", - clnt_index, - get_client_memptr(wan_client, clnt_index)->hdr_hdl_v4); - - if (IPACM_Iface::ipacmcfg->isMCC_Mode == true) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, clnt_index)->hdr_hdl_v4; - rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wan_client, clnt_index)->v4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; - - /* copy ipv4 RT rule hdl */ - IPACMDBG_H("rt rule hdl=%x\n", - get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4); - - rt_rule_entry->rt_rule_hdl = - get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v4; - - if (false == m_routing.ModifyRoutingRule(rt_rule)) - { - IPACMERR("Routing rule modify failed!\n"); - free(rt_rule); - return; - } - } - } - else - { - IPACMDBG_H("wan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", clnt_index, iptype, - get_client_memptr(wan_client, clnt_index)->ipv6_set, - get_client_memptr(wan_client, clnt_index)->route_rule_set_v6); - - if( get_client_memptr(wan_client, clnt_index)->route_rule_set_v6 == 0) - { - continue; - } - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if (iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d skip\n", - tx_index, tx_prop->tx[tx_index].ip, iptype); - continue; - } - - memset(rt_rule, 0, size); - rt_rule->commit = 1; - rt_rule->num_rules = NUM_RULES; - rt_rule->ip = iptype; - rt_rule_entry = &rt_rule->rules[0]; - - /* Modify only rules in v6 WAN RT TBL*/ - for (v6_num = 0; - v6_num < get_client_memptr(wan_client, clnt_index)->route_rule_set_v6; - v6_num++) - { - IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n", - clnt_index, - get_client_memptr(wan_client, clnt_index)->hdr_hdl_v6); - - /* Downlink traffic from Wan iface, directly through IPA */ - if (IPACM_Iface::ipacmcfg->isMCC_Mode == true) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wan_client, clnt_index)->hdr_hdl_v6; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wan_client, clnt_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; - - IPACMDBG_H("rt rule hdl=%x\n", - get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num]); - - rt_rule_entry->rt_rule_hdl = - get_client_memptr(wan_client, clnt_index)->wan_rt_hdl[tx_index].wan_rt_rule_hdl_v6_wan[v6_num]; - - if (false == m_routing.ModifyRoutingRule(rt_rule)) - { - IPACMERR("Routing rule Modify failed!\n"); - free(rt_rule); - return; - } - } - } /* end of for loop */ - } - - } - - free(rt_rule); - return; -} - -/*handle eth client */ -int IPACM_Wan::handle_network_stats_update(ipa_get_apn_data_stats_resp_msg_v01 *data) -{ - FILE *fp = NULL; - - for (int apn_index =0; apn_index < data->apn_data_stats_list_len; apn_index++) - { - if(data->apn_data_stats_list[apn_index].mux_id == ext_prop->ext[0].mux_id) - { - IPACMDBG_H("Received IPA_TETHERING_STATS_UPDATE_NETWORK_STATS, MUX ID %d TX (P%lu/B%lu) RX (P%lu/B%lu)\n", - data->apn_data_stats_list[apn_index].mux_id, - data->apn_data_stats_list[apn_index].num_ul_packets, - data->apn_data_stats_list[apn_index].num_ul_bytes, - data->apn_data_stats_list[apn_index].num_dl_packets, - data->apn_data_stats_list[apn_index].num_dl_bytes); - fp = fopen(IPA_NETWORK_STATS_FILE_NAME, "w"); - if ( fp == NULL ) - { - IPACMERR("Failed to write pipe stats to %s, error is %d - %s\n", - IPA_NETWORK_STATS_FILE_NAME, errno, strerror(errno)); - return IPACM_FAILURE; - } - - fprintf(fp, NETWORK_STATS, - dev_name, - data->apn_data_stats_list[apn_index].num_ul_packets, - data->apn_data_stats_list[apn_index].num_ul_bytes, - data->apn_data_stats_list[apn_index].num_dl_packets, - data->apn_data_stats_list[apn_index].num_dl_bytes); - fclose(fp); - break; - }; - } - return IPACM_SUCCESS; -} - -int IPACM_Wan::add_dummy_rx_hdr() -{ - -#define IFACE_INDEX_LEN 2 - char index[IFACE_INDEX_LEN]; - struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL; - int len = 0; - struct ipa_ioc_copy_hdr sCopyHeader; - struct ipa_hdr_add *ipv6_hdr; - struct ethhdr *eth_ipv6; - struct ipa_ioc_add_hdr_proc_ctx* pHeaderProcTable = NULL; - uint32_t cnt; - - /* get netdev-mac */ - if(tx_prop != NULL) - { - /* copy partial header for v6 */ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v6) - { - IPACMDBG_H("Got partial v6-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - return IPACM_FAILURE; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - return IPACM_FAILURE; - } - else - { - /* copy client mac_addr to partial header */ - IPACMDBG_H("header eth2_ofst_valid: %d, eth2_ofst: %d\n", - sCopyHeader.is_eth2_ofst_valid, sCopyHeader.eth2_ofst); - /* only copy 6 bytes mac-address */ - if(sCopyHeader.is_eth2_ofst_valid == false) - { - memcpy(netdev_mac, &sCopyHeader.hdr[0+IPA_MAC_ADDR_SIZE], - sizeof(netdev_mac)); - } - else - { - memcpy(netdev_mac, &sCopyHeader.hdr[sCopyHeader.eth2_ofst+IPA_MAC_ADDR_SIZE], - sizeof(netdev_mac)); - } - } - break; - } - } - } - - len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add)); - pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len); - if (pHeaderDescriptor == NULL) - { - IPACMERR("calloc failed to allocate pHeaderDescriptor\n"); - return IPACM_FAILURE; - } - ipv6_hdr = &pHeaderDescriptor->hdr[0]; - /* copy ethernet type to header */ - eth_ipv6 = (struct ethhdr *) (ipv6_hdr->hdr +2); - memcpy(eth_ipv6->h_dest, netdev_mac, ETH_ALEN); - memcpy(eth_ipv6->h_source, ext_router_mac_addr, ETH_ALEN); - eth_ipv6->h_proto = htons(ETH_P_IPV6); - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(ipv6_hdr->name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(ipv6_hdr->name, index, sizeof(ipv6_hdr->name)); - ipv6_hdr->name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - - if (strlcat(ipv6_hdr->name, IPA_DUMMY_ETH_HDR_NAME_v6, sizeof(ipv6_hdr->name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(ipv6_hdr->name)); - return IPACM_FAILURE; - } - - ipv6_hdr->hdr_len = ETH_HLEN + 2; - ipv6_hdr->hdr_hdl = -1; - ipv6_hdr->is_partial = 0; - ipv6_hdr->status = -1; - ipv6_hdr->type = IPA_HDR_L2_ETHERNET_II; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - ipv6_hdr->status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", ipv6_hdr->status); - return IPACM_FAILURE; - } - - hdr_hdl_dummy_v6 = ipv6_hdr->hdr_hdl; - IPACMDBG_H("dummy v6 full header name:%s header handle:(0x%x)\n", - ipv6_hdr->name, - hdr_hdl_dummy_v6); - /* add dummy hdr_proc_hdl */ - len = sizeof(struct ipa_ioc_add_hdr_proc_ctx) + sizeof(struct ipa_hdr_proc_ctx_add); - pHeaderProcTable = (ipa_ioc_add_hdr_proc_ctx*)malloc(len); - if(pHeaderProcTable == NULL) - { - IPACMERR("Cannot allocate header processing table.\n"); - return IPACM_FAILURE; - } - - memset(pHeaderProcTable, 0, len); - pHeaderProcTable->commit = 1; - pHeaderProcTable->num_proc_ctxs = 1; - pHeaderProcTable->proc_ctx[0].hdr_hdl = hdr_hdl_dummy_v6; - if (m_header.AddHeaderProcCtx(pHeaderProcTable) == false) - { - IPACMERR("Adding dummy hhdr_proc_hdl failed with status: %d\n", pHeaderProcTable->proc_ctx[0].status); - return IPACM_FAILURE; - } - else - { - hdr_proc_hdl_dummy_v6 = pHeaderProcTable->proc_ctx[0].proc_ctx_hdl; - IPACMDBG_H("dummy hhdr_proc_hdl is added successfully. (0x%x)\n", hdr_proc_hdl_dummy_v6); - } - return IPACM_SUCCESS; -} diff --git a/ipacm/src/IPACM_Wlan.cpp b/ipacm/src/IPACM_Wlan.cpp deleted file mode 100644 index 2152c4d..0000000 --- a/ipacm/src/IPACM_Wlan.cpp +++ /dev/null @@ -1,2037 +0,0 @@ -/* -Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. -* Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! -@file -IPACM_Wlan.cpp - -@brief -This file implements the WLAN iface functionality. - -@Author -Skylar Chang - -*/ - -#include <string.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <IPACM_Wlan.h> -#include <IPACM_Netlink.h> -#include <fcntl.h> -#include <sys/inotify.h> -#include <IPACM_Wan.h> -#include <IPACM_Lan.h> -#include <IPACM_IfaceManager.h> -#include <IPACM_ConntrackListener.h> - - -/* static member to store the number of total wifi clients within all APs*/ -int IPACM_Wlan::total_num_wifi_clients = 0; - -int IPACM_Wlan::num_wlan_ap_iface = 0; - -IPACM_Wlan::IPACM_Wlan(int iface_index) : IPACM_Lan(iface_index) -{ -#define WLAN_AMPDU_DEFAULT_FILTER_RULES 3 - - wlan_ap_index = IPACM_Wlan::num_wlan_ap_iface; - if(wlan_ap_index < 0 || wlan_ap_index > 1) - { - IPACMERR("Wlan_ap_index is not correct: %d, not creating instance.\n", wlan_ap_index); - if (tx_prop != NULL) - { - free(tx_prop); - } - if (rx_prop != NULL) - { - free(rx_prop); - } - if (iface_query != NULL) - { - free(iface_query); - } - delete this; - return; - } - - num_wifi_client = 0; - header_name_count = 0; - wlan_client = NULL; - wlan_client_len = 0; - - if(iface_query != NULL) - { - wlan_client_len = (sizeof(ipa_wlan_client)) + (iface_query->num_tx_props * sizeof(wlan_client_rt_hdl)); - wlan_client = (ipa_wlan_client *)calloc(IPA_MAX_NUM_WIFI_CLIENTS, wlan_client_len); - if (wlan_client == NULL) - { - IPACMERR("unable to allocate memory\n"); - return; - } - IPACMDBG_H("index:%d constructor: Tx properties:%d\n", iface_index, iface_query->num_tx_props); - } - Nat_App = NatApp::GetInstance(); - if (Nat_App == NULL) - { - IPACMERR("unable to get Nat App instance \n"); - return; - } - - IPACM_Wlan::num_wlan_ap_iface++; - IPACMDBG_H("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface); - - m_is_guest_ap = false; - if (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == INTERNET) - { - m_is_guest_ap = true; - } - IPACMDBG_H("%s: guest ap enable: %d \n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, m_is_guest_ap); - -#ifdef FEATURE_IPA_ANDROID - /* set the IPA-client pipe enum */ - if(ipa_if_cate == WLAN_IF) - { - handle_tethering_client(false, IPACM_CLIENT_WLAN); - } -#endif - return; -} - - -IPACM_Wlan::~IPACM_Wlan() -{ - IPACM_EvtDispatcher::deregistr(this); - IPACM_IfaceManager::deregistr(this); - return; -} - -void IPACM_Wlan::event_callback(ipa_cm_event_id event, void *param) -{ - if(is_active == false && event != IPA_LAN_DELETE_SELF) - { - IPACMDBG_H("The interface is no longer active, return.\n"); - return; - } - - int ipa_interface_index; - int wlan_index; - ipacm_ext_prop* ext_prop; - ipacm_event_iface_up* data_wan; - ipacm_event_iface_up_tehter* data_wan_tether; - - switch (event) - { - - case IPA_WLAN_LINK_DOWN_EVENT: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WLAN_LINK_DOWN_EVENT\n"); - handle_down_evt(); - /* reset the AP-iface category to unknown */ - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat = UNKNOWN_IF; - IPACM_Iface::ipacmcfg->DelNatIfaces(dev_name); // delete NAT-iface - IPACM_Wlan::total_num_wifi_clients = (IPACM_Wlan::total_num_wifi_clients) - \ - (num_wifi_client); - return; - } - } - break; - - case IPA_PRIVATE_SUBNET_CHANGE_EVENT: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - /* internel event: data->if_index is ipa_if_index */ - if (data->if_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from itself posting, ignore\n"); - return; - } - else - { - IPACMDBG_H("Received IPA_PRIVATE_SUBNET_CHANGE_EVENT from other LAN iface \n"); -#ifdef FEATURE_IPA_ANDROID - handle_private_subnet_android(IPA_IP_v4); -#endif - IPACMDBG_H(" delete old private subnet rules, use new sets \n"); - return; - } - } - break; - - case IPA_LAN_DELETE_SELF: - { - ipacm_event_data_fid *data = (ipacm_event_data_fid *)param; - if(data->if_index == ipa_if_num) - { - IPACM_Wlan::num_wlan_ap_iface--; - IPACMDBG_H("Now the number of wlan AP iface is %d\n", IPACM_Wlan::num_wlan_ap_iface); - - IPACMDBG_H("Received IPA_LAN_DELETE_SELF event.\n"); - IPACMDBG_H("ipa_WLAN (%s):ipa_index (%d) instance close \n", IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, ipa_if_num); - delete this; - } - break; - } - - case IPA_ADDR_ADD_EVENT: - { - ipacm_event_data_addr *data = (ipacm_event_data_addr *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - - if ( (data->iptype == IPA_IP_v4 && data->ipv4_addr == 0) || - (data->iptype == IPA_IP_v6 && - data->ipv6_addr[0] == 0 && data->ipv6_addr[1] == 0 && - data->ipv6_addr[2] == 0 && data->ipv6_addr[3] == 0) ) - { - IPACMDBG_H("Invalid address, ignore IPA_ADDR_ADD_EVENT event\n"); - return; - } - - if (ipa_interface_index == ipa_if_num) - { - /* check v4 not setup before, v6 can have 2 iface ip */ - if( ((data->iptype != ip_type) && (ip_type != IPA_IP_MAX)) - || ((data->iptype==IPA_IP_v6) && (num_dft_rt_v6!=MAX_DEFAULT_v6_ROUTE_RULES))) - { - IPACMDBG_H("Got IPA_ADDR_ADD_EVENT ip-family:%d, v6 num %d: \n",data->iptype,num_dft_rt_v6); - /* Post event to NAT */ - if (data->iptype == IPA_IP_v4) - { - ipacm_cmd_q_data evt_data; - ipacm_event_iface_up *info; - - info = (ipacm_event_iface_up *) - malloc(sizeof(ipacm_event_iface_up)); - if (info == NULL) - { - IPACMERR("Unable to allocate memory\n"); - return; - } - - memcpy(info->ifname, dev_name, IF_NAME_LEN); - info->ipv4_addr = data->ipv4_addr; - info->addr_mask = IPACM_Iface::ipacmcfg->private_subnet_table[0].subnet_mask; - - evt_data.event = IPA_HANDLE_WLAN_UP; - evt_data.evt_data = (void *)info; - - /* Insert IPA_HANDLE_WLAN_UP to command queue */ - IPACMDBG_H("posting IPA_HANDLE_WLAN_UP for IPv4 with below information\n"); - IPACMDBG_H("IPv4 address:0x%x, IPv4 address mask:0x%x\n", - info->ipv4_addr, info->addr_mask); - IPACM_EvtDispatcher::PostEvt(&evt_data); - } - - if(handle_addr_evt(data) == IPACM_FAILURE) - { - return; - } - -#ifdef FEATURE_IPA_ANDROID - add_dummy_private_subnet_flt_rule(data->iptype); - handle_private_subnet_android(data->iptype); -#else - handle_private_subnet(data->iptype); -#endif - - if (IPACM_Wan::isWanUP(ipa_if_num)) - { - if(data->iptype == IPA_IP_v4 || data->iptype == IPA_IP_MAX) - { - if(IPACM_Wan::backhaul_is_sta_mode == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4); - IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4, - IPACM_Wan::getXlat_Mux_Id()); - } - else - { - IPACM_Lan::handle_wan_up(IPA_IP_v4); - } - } - } - - if(IPACM_Wan::isWanUP_V6(ipa_if_num)) - { - if((data->iptype == IPA_IP_v6 || data->iptype == IPA_IP_MAX) && num_dft_rt_v6 == 1) - { - memcpy(ipv6_prefix, IPACM_Wan::backhaul_ipv6_prefix, sizeof(ipv6_prefix)); - install_ipv6_prefix_flt_rule(IPACM_Wan::backhaul_ipv6_prefix); - - if(IPACM_Wan::backhaul_is_sta_mode == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6); - IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0); - } - else - { - IPACM_Lan::handle_wan_up(IPA_IP_v6); - } - } - } - - IPACMDBG_H("posting IPA_HANDLE_WLAN_UP:Finished checking wan_up\n"); - /* checking if SW-RT_enable */ - if (IPACM_Iface::ipacmcfg->ipa_sw_rt_enable == true) - { - /* handle software routing enable event*/ - IPACMDBG_H("IPA_SW_ROUTING_ENABLE for iface: %s \n",IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - handle_software_routing_enable(); - } - } - } - } - break; -#ifdef FEATURE_IPA_ANDROID - case IPA_HANDLE_WAN_UP_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP_TETHER event\n"); - - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - if(data_wan_tether->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4); - IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4, 0); - } - else - { - IPACM_Lan::handle_wan_up(IPA_IP_v4); - } - } - } - break; - - case IPA_HANDLE_WAN_UP_V6_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6_TETHER event\n"); - - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - memcpy(ipv6_prefix, data_wan_tether->ipv6_prefix, sizeof(ipv6_prefix)); - install_ipv6_prefix_flt_rule(data_wan_tether->ipv6_prefix); - - if(data_wan_tether->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6); - IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0); - } - else - { - IPACM_Lan::handle_wan_up(IPA_IP_v6); - } - } - } - break; - - case IPA_HANDLE_WAN_DOWN_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_TETHER event\n"); - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - if(data_wan_tether->is_sta == false && wlan_ap_index > 0) - { - IPACMDBG_H("This is not the first AP instance and not STA mode, ignore WAN_DOWN event.\n"); - return; - } - if (rx_prop != NULL) - { - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - handle_wan_down(data_wan_tether->is_sta); - } - } - } - break; - - case IPA_HANDLE_WAN_DOWN_V6_TETHER: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6_TETHER event\n"); - data_wan_tether = (ipacm_event_iface_up_tehter*)param; - if(data_wan_tether == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d, if_index_tether:%d tether_if_name:%s\n", data_wan_tether->is_sta, - data_wan_tether->if_index_tether, - IPACM_Iface::ipacmcfg->iface_table[data_wan_tether->if_index_tether].iface_name); - if (data_wan_tether->if_index_tether == ipa_if_num) - { - /* clean up v6 RT rules*/ - IPACMDBG_H("Received IPA_WAN_V6_DOWN in WLAN-instance and need clean up client IPv6 address \n"); - /* reset wifi-client ipv6 rt-rules */ - handle_wlan_client_reset_rt(IPA_IP_v6); - - if (rx_prop != NULL) - { - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - handle_wan_down_v6(data_wan_tether->is_sta); - } - } - } - break; -#else - case IPA_HANDLE_WAN_UP: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP event\n"); - - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - if(data_wan->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v4); - IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v4, data_wan->xlat_mux_id); - } - else - { - IPACM_Lan::handle_wan_up(IPA_IP_v4); - } - } - break; - - case IPA_HANDLE_WAN_UP_V6: - IPACMDBG_H("Received IPA_HANDLE_WAN_UP_V6 event\n"); - - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - memcpy(ipv6_prefix, data_wan->ipv6_prefix, sizeof(ipv6_prefix)); - install_ipv6_prefix_flt_rule(data_wan->ipv6_prefix); - - if(data_wan->is_sta == false) - { - ext_prop = IPACM_Iface::ipacmcfg->GetExtProp(IPA_IP_v6); - IPACM_Lan::handle_wan_up_ex(ext_prop, IPA_IP_v6, 0); - } - else - { - IPACM_Lan::handle_wan_up(IPA_IP_v6); - } - } - break; - - case IPA_HANDLE_WAN_DOWN: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN event\n"); - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - IPACMDBG_H("Backhaul is sta mode?%d\n", data_wan->is_sta); - if (rx_prop != NULL) - { - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - handle_wan_down(data_wan->is_sta); - } - } - break; - - case IPA_HANDLE_WAN_DOWN_V6: - IPACMDBG_H("Received IPA_HANDLE_WAN_DOWN_V6 event\n"); - data_wan = (ipacm_event_iface_up*)param; - if(data_wan == NULL) - { - IPACMERR("No event data is found.\n"); - return; - } - /* clean up v6 RT rules*/ - IPACMDBG_H("Received IPA_WAN_V6_DOWN in WLAN-instance and need clean up client IPv6 address \n"); - /* reset wifi-client ipv6 rt-rules */ - handle_wlan_client_reset_rt(IPA_IP_v6); - IPACMDBG_H("Backhaul is sta mode ? %d\n", data_wan->is_sta); - if (rx_prop != NULL) - { - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - handle_wan_down_v6(data_wan->is_sta); - } - } - break; -#endif - - case IPA_WLAN_CLIENT_ADD_EVENT_EX: - { - ipacm_event_data_wlan_ex *data = (ipacm_event_data_wlan_ex *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - int i; - for(i=0; i<data->num_of_attribs; i++) - { - if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR) - { - eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, data->attribs[i].u.mac_addr); - break; - } - } - IPACMDBG_H("Received IPA_WLAN_CLIENT_ADD_EVENT\n"); - handle_wlan_client_init_ex(data); - } - } - break; - - case IPA_WLAN_CLIENT_DEL_EVENT: - { - ipacm_event_data_mac *data = (ipacm_event_data_mac *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WLAN_CLIENT_DEL_EVENT\n"); - eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_DEL, IPA_IP_MAX, data->mac_addr); - handle_wlan_client_down_evt(data->mac_addr); - } - } - break; - - case IPA_WLAN_CLIENT_POWER_SAVE_EVENT: - { - ipacm_event_data_mac *data = (ipacm_event_data_mac *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WLAN_CLIENT_POWER_SAVE_EVENT\n"); - handle_wlan_client_pwrsave(data->mac_addr); - } - } - break; - - case IPA_WLAN_CLIENT_RECOVER_EVENT: - { - ipacm_event_data_mac *data = (ipacm_event_data_mac *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_WLAN_CLIENT_RECOVER_EVENT\n"); - - wlan_index = get_wlan_client_index(data->mac_addr); - if ((wlan_index != IPACM_INVALID_INDEX) && - (get_client_memptr(wlan_client, wlan_index)->power_save_set == true)) - { - - IPACMDBG_H("change wlan client out of power safe mode \n"); - get_client_memptr(wlan_client, wlan_index)->power_save_set = false; - - /* First add route rules and then nat rules */ - if(get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) /* for ipv4 */ - { - IPACMDBG_H("recover client index(%d):ipv4 address: 0x%x\n", - wlan_index, - get_client_memptr(wlan_client, wlan_index)->v4_addr); - - IPACMDBG_H("Adding Route Rules\n"); - handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v4); - IPACMDBG_H("Adding Nat Rules\n"); - Nat_App->ResetPwrSaveIf(get_client_memptr(wlan_client, wlan_index)->v4_addr); - } - - if(get_client_memptr(wlan_client, wlan_index)->ipv6_set != 0) /* for ipv6 */ - { - handle_wlan_client_route_rule(data->mac_addr, IPA_IP_v6); - } - } - } - } - break; - - case IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT: - { - ipacm_event_data_all *data = (ipacm_event_data_all *)param; - ipa_interface_index = iface_ipa_index_query(data->if_index); - if (ipa_interface_index == ipa_if_num) - { - IPACMDBG_H("Received IPA_NEIGH_CLIENT_IP_ADDR_ADD_EVENT\n"); - if (handle_wlan_client_ipaddr(data) == IPACM_FAILURE) - { - return; - } - - handle_wlan_client_route_rule(data->mac_addr, data->iptype); - if (data->iptype == IPA_IP_v4) - { - /* Add NAT rules after ipv4 RT rules are set */ - CtList->HandleNeighIpAddrAddEvt(data); - //Nat_App->ResetPwrSaveIf(data->ipv4_addr); - } - } - } - break; - - /* handle software routing enable event, iface will update softwarerouting_act to true*/ - case IPA_SW_ROUTING_ENABLE: - IPACMDBG_H("Received IPA_SW_ROUTING_ENABLE\n"); - IPACM_Iface::handle_software_routing_enable(); - break; - - /* handle software routing disable event, iface will update softwarerouting_act to false*/ - case IPA_SW_ROUTING_DISABLE: - IPACMDBG_H("Received IPA_SW_ROUTING_DISABLE\n"); - IPACM_Iface::handle_software_routing_disable(); - break; - - case IPA_WLAN_SWITCH_TO_SCC: - IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_SCC\n"); - if(ip_type == IPA_IP_MAX) - { - handle_SCC_MCC_switch(IPA_IP_v4); - handle_SCC_MCC_switch(IPA_IP_v6); - } - else - { - handle_SCC_MCC_switch(ip_type); - } - eth_bridge_post_event(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, IPA_IP_MAX, NULL); - break; - - case IPA_WLAN_SWITCH_TO_MCC: - IPACMDBG_H("Received IPA_WLAN_SWITCH_TO_MCC\n"); - if(ip_type == IPA_IP_MAX) - { - handle_SCC_MCC_switch(IPA_IP_v4); - handle_SCC_MCC_switch(IPA_IP_v6); - } - else - { - handle_SCC_MCC_switch(ip_type); - } - eth_bridge_post_event(IPA_ETH_BRIDGE_WLAN_SCC_MCC_SWITCH, IPA_IP_MAX, NULL); - break; - - case IPA_CRADLE_WAN_MODE_SWITCH: - { - IPACMDBG_H("Received IPA_CRADLE_WAN_MODE_SWITCH event.\n"); - ipacm_event_cradle_wan_mode* wan_mode = (ipacm_event_cradle_wan_mode*)param; - if(wan_mode == NULL) - { - IPACMERR("Event data is empty.\n"); - return; - } - - if(wan_mode->cradle_wan_mode == BRIDGE) - { - handle_cradle_wan_mode_switch(true); - } - else - { - handle_cradle_wan_mode_switch(false); - } - } - break; - case IPA_CFG_CHANGE_EVENT: - { - IPACMDBG_H("Received IPA_CFG_CHANGE_EVENT event for %s with new wlan-mode: %s old wlan-mode: %s\n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name, - (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == 0) ? "full" : "internet", - (m_is_guest_ap == true) ? "internet" : "full"); - /* Add Natting iface to IPACM_Config if there is Rx/Tx property */ - if (rx_prop != NULL || tx_prop != NULL) - { - IPACMDBG_H(" Has rx/tx properties registered for iface %s, add for NATTING \n", dev_name); - IPACM_Iface::ipacmcfg->AddNatIfaces(dev_name); - } - - if (m_is_guest_ap == true && (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == FULL)) - { - m_is_guest_ap = false; - IPACMDBG_H("wlan mode is switched to full access mode. \n"); - eth_bridge_handle_wlan_mode_switch(); - } - else if (m_is_guest_ap == false && (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].wlan_mode == INTERNET)) - { - m_is_guest_ap = true; - IPACMDBG_H("wlan mode is switched to internet only access mode. \n"); - eth_bridge_handle_wlan_mode_switch(); - } - else - { - IPACMDBG_H("No change in %s access mode. \n", - IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].iface_name); - } - } - break; - case IPA_TETHERING_STATS_UPDATE_EVENT: - { - IPACMDBG_H("Received IPA_TETHERING_STATS_UPDATE_EVENT event.\n"); - if (IPACM_Wan::isWanUP(ipa_if_num) || IPACM_Wan::isWanUP_V6(ipa_if_num)) - { - if(IPACM_Wan::backhaul_is_sta_mode == false) /* LTE */ - { - ipa_get_data_stats_resp_msg_v01 *data = (ipa_get_data_stats_resp_msg_v01 *)param; - if (data->ipa_stats_type != QMI_IPA_STATS_TYPE_PIPE_V01) - { - IPACMERR("not valid pipe stats\n"); - return; - } - handle_tethering_stats_event(data); - }; - } - } - break; - default: - break; - } - return; -} - -/* handle wifi client initial,copy all partial headers (tx property) */ -int IPACM_Wlan::handle_wlan_client_init_ex(ipacm_event_data_wlan_ex *data) -{ - -#define WLAN_IFACE_INDEX_LEN 2 - - int res = IPACM_SUCCESS, len = 0, i, evt_size; - char index[WLAN_IFACE_INDEX_LEN]; - struct ipa_ioc_copy_hdr sCopyHeader; - struct ipa_ioc_add_hdr *pHeaderDescriptor = NULL; - uint32_t cnt; - - /* start of adding header */ - IPACMDBG_H("Wifi client number for this iface: %d & total number of wlan clients: %d\n", - num_wifi_client,IPACM_Wlan::total_num_wifi_clients); - - if ((num_wifi_client >= IPA_MAX_NUM_WIFI_CLIENTS) || - (IPACM_Wlan::total_num_wifi_clients >= IPA_MAX_NUM_WIFI_CLIENTS)) - { - IPACMERR("Reached maximum number of wlan clients\n"); - return IPACM_FAILURE; - } - - IPACMDBG_H("Wifi client number: %d\n", num_wifi_client); - - /* add header to IPA */ - if(tx_prop != NULL) - { - len = sizeof(struct ipa_ioc_add_hdr) + (1 * sizeof(struct ipa_hdr_add)); - pHeaderDescriptor = (struct ipa_ioc_add_hdr *)calloc(1, len); - if (pHeaderDescriptor == NULL) - { - IPACMERR("calloc failed to allocate pHeaderDescriptor\n"); - return IPACM_FAILURE; - } - - evt_size = sizeof(ipacm_event_data_wlan_ex) + data->num_of_attribs * sizeof(struct ipa_wlan_hdr_attrib_val); - get_client_memptr(wlan_client, num_wifi_client)->p_hdr_info = (ipacm_event_data_wlan_ex*)malloc(evt_size); - memcpy(get_client_memptr(wlan_client, num_wifi_client)->p_hdr_info, data, evt_size); - - /* copy partial header for v4*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v4) - { - IPACMDBG_H("Got partial v4-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - for(i = 0; i < data->num_of_attribs; i++) - { - if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR) - { - memcpy(get_client_memptr(wlan_client, num_wifi_client)->mac, - data->attribs[i].u.mac_addr, - sizeof(get_client_memptr(wlan_client, num_wifi_client)->mac)); - - /* copy client mac_addr to partial header */ - memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset], - get_client_memptr(wlan_client, num_wifi_client)->mac, - IPA_MAC_ADDR_SIZE); - /* replace src mac to bridge mac_addr if any */ - if (IPACM_Iface::ipacmcfg->ipa_bridge_enable) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset+IPA_MAC_ADDR_SIZE], - IPACM_Iface::ipacmcfg->bridge_mac, - IPA_MAC_ADDR_SIZE); - IPACMDBG_H("device is in bridge mode \n"); - } - - } - else if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_STA_ID) - { - /* copy client id to header */ - memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset], - &data->attribs[i].u.sta_id, sizeof(data->attribs[i].u.sta_id)); - } - else - { - IPACMDBG_H("The attribute type is not expected!\n"); - } - } - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - - if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v4, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - snprintf(index,sizeof(index), "%d", header_name_count); - if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4 = pHeaderDescriptor->hdr[0].hdr_hdl; - IPACMDBG_H("client(%d) v4 full header name:%s header handle:(0x%x)\n", - num_wifi_client, - pHeaderDescriptor->hdr[0].name, - get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v4); - get_client_memptr(wlan_client, num_wifi_client)->ipv4_header_set=true; - break; - } - } - - /* copy partial header for v6*/ - for (cnt=0; cnt<tx_prop->num_tx_props; cnt++) - { - if(tx_prop->tx[cnt].ip==IPA_IP_v6) - { - IPACMDBG_H("Got partial v6-header name from %d tx props\n", cnt); - memset(&sCopyHeader, 0, sizeof(sCopyHeader)); - memcpy(sCopyHeader.name, - tx_prop->tx[cnt].hdr_name, - sizeof(sCopyHeader.name)); - - IPACMDBG_H("header name: %s in tx:%d\n", sCopyHeader.name,cnt); - if (m_header.CopyHeader(&sCopyHeader) == false) - { - PERROR("ioctl copy header failed"); - res = IPACM_FAILURE; - goto fail; - } - - IPACMDBG_H("header length: %d, paritial: %d\n", sCopyHeader.hdr_len, sCopyHeader.is_partial); - if (sCopyHeader.hdr_len > IPA_HDR_MAX_SIZE) - { - IPACMERR("header oversize\n"); - res = IPACM_FAILURE; - goto fail; - } - else - { - memcpy(pHeaderDescriptor->hdr[0].hdr, - sCopyHeader.hdr, - sCopyHeader.hdr_len); - } - - for(i = 0; i < data->num_of_attribs; i++) - { - if(data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_MAC_ADDR) - { - memcpy(get_client_memptr(wlan_client, num_wifi_client)->mac, - data->attribs[i].u.mac_addr, - sizeof(get_client_memptr(wlan_client, num_wifi_client)->mac)); - - /* copy client mac_addr to partial header */ - memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset], - get_client_memptr(wlan_client, num_wifi_client)->mac, - IPA_MAC_ADDR_SIZE); - - /* replace src mac to bridge mac_addr if any */ - if (IPACM_Iface::ipacmcfg->ipa_bridge_enable) - { - memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset+IPA_MAC_ADDR_SIZE], - IPACM_Iface::ipacmcfg->bridge_mac, - IPA_MAC_ADDR_SIZE); - IPACMDBG_H("device is in bridge mode \n"); - } - } - else if (data->attribs[i].attrib_type == WLAN_HDR_ATTRIB_STA_ID) - { - /* copy client id to header */ - memcpy(&pHeaderDescriptor->hdr[0].hdr[data->attribs[i].offset], - &data->attribs[i].u.sta_id, sizeof(data->attribs[i].u.sta_id)); - } - else - { - IPACMDBG_H("The attribute type is not expected!\n"); - } - } - - pHeaderDescriptor->commit = true; - pHeaderDescriptor->num_hdrs = 1; - - memset(pHeaderDescriptor->hdr[0].name, 0, - sizeof(pHeaderDescriptor->hdr[0].name)); - - snprintf(index,sizeof(index), "%d", ipa_if_num); - strlcpy(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)); - pHeaderDescriptor->hdr[0].name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - if (strlcat(pHeaderDescriptor->hdr[0].name, IPA_WLAN_PARTIAL_HDR_NAME_v6, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - snprintf(index,sizeof(index), "%d", header_name_count); - if (strlcat(pHeaderDescriptor->hdr[0].name, index, sizeof(pHeaderDescriptor->hdr[0].name)) > IPA_RESOURCE_NAME_MAX) - { - IPACMERR(" header name construction failed exceed length (%d)\n", strlen(pHeaderDescriptor->hdr[0].name)); - res = IPACM_FAILURE; - goto fail; - } - - pHeaderDescriptor->hdr[0].hdr_len = sCopyHeader.hdr_len; - pHeaderDescriptor->hdr[0].hdr_hdl = -1; - pHeaderDescriptor->hdr[0].is_partial = 0; - pHeaderDescriptor->hdr[0].status = -1; - - if (m_header.AddHeader(pHeaderDescriptor) == false || - pHeaderDescriptor->hdr[0].status != 0) - { - IPACMERR("ioctl IPA_IOC_ADD_HDR failed: %d\n", pHeaderDescriptor->hdr[0].status); - res = IPACM_FAILURE; - goto fail; - } - - get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v6 = pHeaderDescriptor->hdr[0].hdr_hdl; - IPACMDBG_H("client(%d) v6 full header name:%s header handle:(0x%x)\n", - num_wifi_client, - pHeaderDescriptor->hdr[0].name, - get_client_memptr(wlan_client, num_wifi_client)->hdr_hdl_v6); - - get_client_memptr(wlan_client, num_wifi_client)->ipv6_header_set=true; - break; - } - } - - /* initialize wifi client*/ - get_client_memptr(wlan_client, num_wifi_client)->route_rule_set_v4 = false; - get_client_memptr(wlan_client, num_wifi_client)->route_rule_set_v6 = 0; - get_client_memptr(wlan_client, num_wifi_client)->ipv4_set = false; - get_client_memptr(wlan_client, num_wifi_client)->ipv6_set = 0; - get_client_memptr(wlan_client, num_wifi_client)->power_save_set=false; - num_wifi_client++; - header_name_count++; //keep increasing header_name_count - IPACM_Wlan::total_num_wifi_clients++; - res = IPACM_SUCCESS; - IPACMDBG_H("Wifi client number: %d\n", num_wifi_client); - } - else - { - return res; - } - -fail: - free(pHeaderDescriptor); - return res; -} - -/*handle wifi client */ -int IPACM_Wlan::handle_wlan_client_ipaddr(ipacm_event_data_all *data) -{ - int clnt_indx; - int v6_num; - uint32_t ipv6_link_local_prefix = 0xFE800000; - uint32_t ipv6_link_local_prefix_mask = 0xFFC00000; - - IPACMDBG_H("number of wifi clients: %d\n", num_wifi_client); - IPACMDBG_H(" event MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - data->mac_addr[0], - data->mac_addr[1], - data->mac_addr[2], - data->mac_addr[3], - data->mac_addr[4], - data->mac_addr[5]); - - clnt_indx = get_wlan_client_index(data->mac_addr); - - if (clnt_indx == IPACM_INVALID_INDEX) - { - IPACMERR("wlan client not found/attached \n"); - return IPACM_FAILURE; - } - - IPACMDBG_H("Ip-type received %d\n", data->iptype); - if (data->iptype == IPA_IP_v4) - { - IPACMDBG_H("ipv4 address: 0x%x\n", data->ipv4_addr); - if (data->ipv4_addr != 0) /* not 0.0.0.0 */ - { - if (get_client_memptr(wlan_client, clnt_indx)->ipv4_set == false) - { - get_client_memptr(wlan_client, clnt_indx)->v4_addr = data->ipv4_addr; - get_client_memptr(wlan_client, clnt_indx)->ipv4_set = true; - } - else - { - /* check if client got new IPv4 address*/ - if(data->ipv4_addr == get_client_memptr(wlan_client, clnt_indx)->v4_addr) - { - IPACMDBG_H("Already setup ipv4 addr for client:%d, ipv4 address didn't change\n", clnt_indx); - return IPACM_FAILURE; - } - else - { - IPACMDBG_H("ipv4 addr for client:%d is changed \n", clnt_indx); - /* delete NAT rules first */ - CtList->HandleNeighIpAddrDelEvt(get_client_memptr(wlan_client, clnt_indx)->v4_addr); - delete_default_qos_rtrules(clnt_indx,IPA_IP_v4); - get_client_memptr(wlan_client, clnt_indx)->route_rule_set_v4 = false; - get_client_memptr(wlan_client, clnt_indx)->v4_addr = data->ipv4_addr; - } - } - } - else - { - IPACMDBG_H("Invalid client IPv4 address \n"); - return IPACM_FAILURE; - } - } - else - { - if ((data->ipv6_addr[0] != 0) || (data->ipv6_addr[1] != 0) || - (data->ipv6_addr[2] != 0) || (data->ipv6_addr[3] || 0)) /* check if all 0 not valid ipv6 address */ - { - IPACMDBG_H("ipv6 address: 0x%x:%x:%x:%x\n", data->ipv6_addr[0], data->ipv6_addr[1], data->ipv6_addr[2], data->ipv6_addr[3]); - if( (data->ipv6_addr[0] & ipv6_link_local_prefix_mask) != (ipv6_link_local_prefix & ipv6_link_local_prefix_mask) && - memcmp(ipv6_prefix, data->ipv6_addr, sizeof(ipv6_prefix)) != 0) - { - IPACMDBG_H("This IPv6 address is not global IPv6 address with correct prefix, ignore.\n"); - return IPACM_FAILURE; - } - - if(get_client_memptr(wlan_client, clnt_indx)->ipv6_set < IPV6_NUM_ADDR) - { - - for(v6_num=0;v6_num < get_client_memptr(wlan_client, clnt_indx)->ipv6_set;v6_num++) - { - if( data->ipv6_addr[0] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][0] && - data->ipv6_addr[1] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][1] && - data->ipv6_addr[2]== get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][2] && - data->ipv6_addr[3] == get_client_memptr(wlan_client, clnt_indx)->v6_addr[v6_num][3]) - { - IPACMDBG_H("Already see this ipv6 addr for client:%d\n", clnt_indx); - return IPACM_FAILURE; /* not setup the RT rules*/ - break; - } - } - - /* not see this ipv6 before for wifi client*/ - get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][0] = data->ipv6_addr[0]; - get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][1] = data->ipv6_addr[1]; - get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][2] = data->ipv6_addr[2]; - get_client_memptr(wlan_client, clnt_indx)->v6_addr[get_client_memptr(wlan_client, clnt_indx)->ipv6_set][3] = data->ipv6_addr[3]; - get_client_memptr(wlan_client, clnt_indx)->ipv6_set++; - } - else - { - IPACMDBG_H("Already got %d ipv6 addr for client:%d\n", IPV6_NUM_ADDR, clnt_indx); - return IPACM_FAILURE; /* not setup the RT rules*/ - } - } - } - - return IPACM_SUCCESS; -} - -/*handle wifi client routing rule*/ -int IPACM_Wlan::handle_wlan_client_route_rule(uint8_t *mac_addr, ipa_ip_type iptype) -{ - struct ipa_ioc_add_rt_rule *rt_rule; - struct ipa_rt_rule_add *rt_rule_entry; - uint32_t tx_index; - int wlan_index,v6_num; - const int NUM = 1; - - if(tx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return IPACM_SUCCESS; - } - - IPACMDBG_H("Received mac_addr MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - mac_addr[0], mac_addr[1], mac_addr[2], - mac_addr[3], mac_addr[4], mac_addr[5]); - - wlan_index = get_wlan_client_index(mac_addr); - if (wlan_index == IPACM_INVALID_INDEX) - { - IPACMDBG_H("wlan client not found/attached \n"); - return IPACM_SUCCESS; - } - - /* during power_save mode, even receive IP_ADDR_ADD, not setting RT rules*/ - if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true) - { - IPACMDBG_H("wlan client is in power safe mode \n"); - return IPACM_SUCCESS; - } - - if (iptype==IPA_IP_v4) - { - IPACMDBG_H("wlan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", wlan_index, iptype, - get_client_memptr(wlan_client, wlan_index)->ipv4_set, - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4); - } - else - { - IPACMDBG_H("wlan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", wlan_index, iptype, - get_client_memptr(wlan_client, wlan_index)->ipv6_set, - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6); - } - - - /* Add default Qos routing rules if not set yet */ - if ((iptype == IPA_IP_v4 - && get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4 == false - && get_client_memptr(wlan_client, wlan_index)->ipv4_set == true) - || (iptype == IPA_IP_v6 - && get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6 < get_client_memptr(wlan_client, wlan_index)->ipv6_set - )) - { - rt_rule = (struct ipa_ioc_add_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_add_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_add)); - - if (rt_rule == NULL) - { - PERROR("Error Locate ipa_ioc_add_rt_rule memory...\n"); - return IPACM_FAILURE; - } - - rt_rule->commit = 1; - rt_rule->num_rules = (uint8_t)NUM; - rt_rule->ip = iptype; - - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - - if(iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d conflict ip-type: %d no RT-rule added\n", - tx_index, tx_prop->tx[tx_index].ip,iptype); - continue; - } - - rt_rule_entry = &rt_rule->rules[0]; - rt_rule_entry->at_rear = 0; - - if (iptype == IPA_IP_v4) - { - IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", wlan_index, - get_client_memptr(wlan_client, wlan_index)->v4_addr); - - IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n", - wlan_index, - get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4); - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_lan_v4.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - - if(IPACM_Iface::ipacmcfg->isMCC_Mode) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4; - rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = false; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - /* copy ipv4 RT hdl */ - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4 = - rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4, iptype); - } - else - { - for(v6_num = get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6;v6_num < get_client_memptr(wlan_client, wlan_index)->ipv6_set;v6_num++) - { - IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n", - wlan_index, - get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6); - - /* v6 LAN_RT_TBL */ - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_v6.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - /* Support QCMAP LAN traffic feature, send to A5 */ - rt_rule_entry->rule.dst = iface_query->excp_pipe; - memset(&rt_rule_entry->rule.attrib, 0, sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.hdr_hdl = 0; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[v6_num] = rt_rule->rules[0].rt_rule_hdl; - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[v6_num], iptype); - - /*Copy same rule to v6 WAN RT TBL*/ - strlcpy(rt_rule->rt_tbl_name, - IPACM_Iface::ipacmcfg->rt_tbl_wan_v6.name, - sizeof(rt_rule->rt_tbl_name)); - rt_rule->rt_tbl_name[IPA_RESOURCE_NAME_MAX-1] = '\0'; - /* Downlink traffic from Wan iface, directly through IPA */ - if(IPACM_Iface::ipacmcfg->isMCC_Mode) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; -#ifdef FEATURE_IPA_V3 - rt_rule_entry->rule.hashable = true; -#endif - if (false == m_routing.AddRoutingRule(rt_rule)) - { - IPACMERR("Routing rule addition failed!\n"); - free(rt_rule); - return IPACM_FAILURE; - } - - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[v6_num] = rt_rule->rules[0].rt_rule_hdl; - - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[v6_num], iptype); - } - } - - } /* end of for loop */ - - free(rt_rule); - - if (iptype == IPA_IP_v4) - { - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4 = true; - } - else - { - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6 = get_client_memptr(wlan_client, wlan_index)->ipv6_set; - } - } - - return IPACM_SUCCESS; -} - -/*handle wifi client power-save mode*/ -int IPACM_Wlan::handle_wlan_client_pwrsave(uint8_t *mac_addr) -{ - int clt_indx; - IPACMDBG_H("wlan->handle_wlan_client_pwrsave();\n"); - - clt_indx = get_wlan_client_index(mac_addr); - if (clt_indx == IPACM_INVALID_INDEX) - { - IPACMDBG_H("wlan client not attached\n"); - return IPACM_SUCCESS; - } - - if (get_client_memptr(wlan_client, clt_indx)->power_save_set == false) - { - /* First reset nat rules and then route rules */ - if(get_client_memptr(wlan_client, clt_indx)->ipv4_set == true) - { - IPACMDBG_H("Deleting Nat Rules\n"); - Nat_App->UpdatePwrSaveIf(get_client_memptr(wlan_client, clt_indx)->v4_addr); - } - - IPACMDBG_H("Deleting default qos Route Rules\n"); - delete_default_qos_rtrules(clt_indx, IPA_IP_v4); - delete_default_qos_rtrules(clt_indx, IPA_IP_v6); - get_client_memptr(wlan_client, clt_indx)->power_save_set = true; - } - else - { - IPACMDBG_H("wlan client already in power-save mode\n"); - } - return IPACM_SUCCESS; -} - -/*handle wifi client del mode*/ -int IPACM_Wlan::handle_wlan_client_down_evt(uint8_t *mac_addr) -{ - int clt_indx; - uint32_t tx_index; - int num_wifi_client_tmp = num_wifi_client; - int num_v6; - - IPACMDBG_H("total client: %d\n", num_wifi_client_tmp); - - clt_indx = get_wlan_client_index(mac_addr); - if (clt_indx == IPACM_INVALID_INDEX) - { - IPACMDBG_H("wlan client not attached\n"); - return IPACM_SUCCESS; - } - - /* First reset nat rules and then route rules */ - if(get_client_memptr(wlan_client, clt_indx)->ipv4_set == true) - { - IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wlan_client, clt_indx)->v4_addr); - CtList->HandleNeighIpAddrDelEvt(get_client_memptr(wlan_client, clt_indx)->v4_addr); - } - - if (delete_default_qos_rtrules(clt_indx, IPA_IP_v4)) - { - IPACMERR("unbale to delete v4 default qos route rules for index: %d\n", clt_indx); - return IPACM_FAILURE; - } - - if (delete_default_qos_rtrules(clt_indx, IPA_IP_v6)) - { - IPACMERR("unbale to delete v6 default qos route rules for indexn: %d\n", clt_indx); - return IPACM_FAILURE; - } - - /* Delete wlan client header */ - if(get_client_memptr(wlan_client, clt_indx)->ipv4_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v4) - == false) - { - return IPACM_FAILURE; - } - get_client_memptr(wlan_client, clt_indx)->ipv4_header_set = false; - } - - if(get_client_memptr(wlan_client, clt_indx)->ipv6_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v6) - == false) - { - return IPACM_FAILURE; - } - get_client_memptr(wlan_client, clt_indx)->ipv6_header_set = false; - } - - /* Reset ip_set to 0*/ - get_client_memptr(wlan_client, clt_indx)->ipv4_set = false; - get_client_memptr(wlan_client, clt_indx)->ipv6_set = 0; - get_client_memptr(wlan_client, clt_indx)->ipv4_header_set = false; - get_client_memptr(wlan_client, clt_indx)->ipv6_header_set = false; - get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = false; - get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = 0; - free(get_client_memptr(wlan_client, clt_indx)->p_hdr_info); - - for (; clt_indx < num_wifi_client_tmp - 1; clt_indx++) - { - get_client_memptr(wlan_client, clt_indx)->p_hdr_info = get_client_memptr(wlan_client, (clt_indx + 1))->p_hdr_info; - - memcpy(get_client_memptr(wlan_client, clt_indx)->mac, - get_client_memptr(wlan_client, (clt_indx + 1))->mac, - sizeof(get_client_memptr(wlan_client, clt_indx)->mac)); - - get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v4 = get_client_memptr(wlan_client, (clt_indx + 1))->hdr_hdl_v4; - get_client_memptr(wlan_client, clt_indx)->hdr_hdl_v6 = get_client_memptr(wlan_client, (clt_indx + 1))->hdr_hdl_v6; - get_client_memptr(wlan_client, clt_indx)->v4_addr = get_client_memptr(wlan_client, (clt_indx + 1))->v4_addr; - - get_client_memptr(wlan_client, clt_indx)->ipv4_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv4_set; - get_client_memptr(wlan_client, clt_indx)->ipv6_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv6_set; - get_client_memptr(wlan_client, clt_indx)->ipv4_header_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv4_header_set; - get_client_memptr(wlan_client, clt_indx)->ipv6_header_set = get_client_memptr(wlan_client, (clt_indx + 1))->ipv6_header_set; - - get_client_memptr(wlan_client, clt_indx)->route_rule_set_v4 = get_client_memptr(wlan_client, (clt_indx + 1))->route_rule_set_v4; - get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6 = get_client_memptr(wlan_client, (clt_indx + 1))->route_rule_set_v6; - - for(num_v6=0;num_v6< get_client_memptr(wlan_client, clt_indx)->ipv6_set;num_v6++) - { - get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][0] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][0]; - get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][1] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][1]; - get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][2] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][2]; - get_client_memptr(wlan_client, clt_indx)->v6_addr[num_v6][3] = get_client_memptr(wlan_client, (clt_indx + 1))->v6_addr[num_v6][3]; - } - - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4 = - get_client_memptr(wlan_client, (clt_indx + 1))->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4; - - for(num_v6=0;num_v6< get_client_memptr(wlan_client, clt_indx)->route_rule_set_v6;num_v6++) - { - get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6] = - get_client_memptr(wlan_client, (clt_indx + 1))->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6[num_v6]; - get_client_memptr(wlan_client, clt_indx)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6] = - get_client_memptr(wlan_client, (clt_indx + 1))->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[num_v6]; - } - } - } - - IPACMDBG_H(" %d wifi client deleted successfully \n", num_wifi_client); - num_wifi_client = num_wifi_client - 1; - IPACM_Wlan::total_num_wifi_clients = IPACM_Wlan::total_num_wifi_clients - 1; - IPACMDBG_H(" Number of wifi client: %d\n", num_wifi_client); - - return IPACM_SUCCESS; -} - -/*handle wlan iface down event*/ -int IPACM_Wlan::handle_down_evt() -{ - int res = IPACM_SUCCESS, i, num_private_subnet_fl_rule; - - IPACMDBG_H("WLAN ip-type: %d \n", ip_type); - /* no iface address up, directly close iface*/ - if (ip_type == IPACM_IP_NULL) - { - IPACMERR("Invalid iptype: 0x%x\n", ip_type); - goto fail; - } - - /* delete wan filter rule */ - if (IPACM_Wan::isWanUP(ipa_if_num) && rx_prop != NULL) - { - IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode); - IPACM_Lan::handle_wan_down(IPACM_Wan::backhaul_is_sta_mode); - } - - if (IPACM_Wan::isWanUP_V6(ipa_if_num) && rx_prop != NULL) - { - IPACMDBG_H("LAN IF goes down, backhaul type %d\n", IPACM_Wan::backhaul_is_sta_mode); - handle_wan_down_v6(IPACM_Wan::backhaul_is_sta_mode); - } - IPACMDBG_H("finished deleting wan filtering rules\n "); - - /* Delete v4 filtering rules */ - if (ip_type != IPA_IP_v6 && rx_prop != NULL) - { - /* delete IPv4 icmp filter rules */ - if(m_filtering.DeleteFilteringHdls(ipv4_icmp_flt_rule_hdl, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE) == false) - { - IPACMERR("Error Deleting ICMPv4 Filtering Rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, NUM_IPV4_ICMP_FLT_RULE); - - if (m_filtering.DeleteFilteringHdls(dft_v4fl_rule_hdl, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES) == false) - { - IPACMERR("Error Deleting Filtering Rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPV4_DEFAULT_FILTERTING_RULES); - IPACMDBG_H("Deleted default v4 filter rules successfully.\n"); - - /* delete private-ipv4 filter rules */ -#ifdef FEATURE_IPA_ANDROID - if(m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES) == false) - { - IPACMERR("Error deleting private subnet IPv4 flt rules.\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, IPA_MAX_PRIVATE_SUBNET_ENTRIES); -#else - num_private_subnet_fl_rule = IPACM_Iface::ipacmcfg->ipa_num_private_subnet > IPA_MAX_PRIVATE_SUBNET_ENTRIES? - IPA_MAX_PRIVATE_SUBNET_ENTRIES : IPACM_Iface::ipacmcfg->ipa_num_private_subnet; - if(m_filtering.DeleteFilteringHdls(private_fl_rule_hdl, IPA_IP_v4, num_private_subnet_fl_rule) == false) - { - IPACMERR("Error deleting private subnet flt rules, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v4, num_private_subnet_fl_rule); -#endif - IPACMDBG_H("Deleted private subnet v4 filter rules successfully.\n"); - } - - /* Delete v6 filtering rules */ - if (ip_type != IPA_IP_v4 && rx_prop != NULL) - { - /* delete icmp filter rules */ - if(m_filtering.DeleteFilteringHdls(ipv6_icmp_flt_rule_hdl, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE) == false) - { - IPACMERR("Error Deleting ICMPv6 Filtering Rule, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, NUM_IPV6_ICMP_FLT_RULE); - - if (m_filtering.DeleteFilteringHdls(dft_v6fl_rule_hdl, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES) == false) - { - IPACMERR("Error Adding RuleTable(1) to Filtering, aborting...\n"); - res = IPACM_FAILURE; - goto fail; - } - IPACM_Iface::ipacmcfg->decreaseFltRuleCount(rx_prop->rx[0].src_pipe, IPA_IP_v6, IPV6_DEFAULT_FILTERTING_RULES); - IPACMDBG_H("Deleted default v6 filter rules successfully.\n"); - } - IPACMDBG_H("finished delete filtering rules\n "); - - /* Delete default v4 RT rule */ - if (ip_type != IPA_IP_v6) - { - IPACMDBG_H("Delete default v4 routing rules\n"); - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[0], IPA_IP_v4) - == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - - /* Delete default v6 RT rule */ - if (ip_type != IPA_IP_v4) - { - IPACMDBG_H("Delete default v6 routing rules\n"); - /* May have multiple ipv6 iface-RT rules */ - for (i = 0; i < 2*num_dft_rt_v6; i++) - { - if (m_routing.DeleteRoutingHdl(dft_rt_rule_hdl[MAX_DEFAULT_v4_ROUTE_RULES+i], IPA_IP_v6) - == false) - { - IPACMERR("Routing rule deletion failed!\n"); - res = IPACM_FAILURE; - goto fail; - } - } - } - IPACMDBG_H("finished deleting default RT rules\n "); - - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL); - - /* free the wlan clients cache */ - IPACMDBG_H("Free wlan clients cache\n"); - - /* Delete private subnet*/ -#ifdef FEATURE_IPA_ANDROID - if (ip_type != IPA_IP_v6) - { - IPACMDBG_H("current IPACM private subnet_addr number(%d)\n", IPACM_Iface::ipacmcfg->ipa_num_private_subnet); - IPACMDBG_H(" Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet); - if(IPACM_Iface::ipacmcfg->DelPrivateSubnet(if_ipv4_subnet, ipa_if_num) == false) - { - IPACMERR(" can't Delete IPACM private subnet_addr as: 0x%x \n", if_ipv4_subnet); - } - } - /* reset the IPA-client pipe enum */ - handle_tethering_client(true, IPACM_CLIENT_WLAN); -#endif /* defined(FEATURE_IPA_ANDROID)*/ - -fail: - /* clean wifi-client header, routing rules */ - /* clean wifi client rule*/ - IPACMDBG_H("left %d wifi clients need to be deleted \n ", num_wifi_client); - for (i = 0; i < num_wifi_client; i++) - { - /* First reset nat rules and then route rules */ - if(get_client_memptr(wlan_client, i)->ipv4_set == true) - { - IPACMDBG_H("Clean Nat Rules for ipv4:0x%x\n", get_client_memptr(wlan_client, i)->v4_addr); - CtList->HandleNeighIpAddrDelEvt(get_client_memptr(wlan_client, i)->v4_addr); - } - - if (delete_default_qos_rtrules(i, IPA_IP_v4)) - { - IPACMERR("unbale to delete v4 default qos route rules for index: %d\n", i); - res = IPACM_FAILURE; - } - - if (delete_default_qos_rtrules(i, IPA_IP_v6)) - { - IPACMERR("unbale to delete v6 default qos route rules for index: %d\n", i); - res = IPACM_FAILURE; - } - - IPACMDBG_H("Delete %d client header\n", num_wifi_client); - - if(get_client_memptr(wlan_client, i)->ipv4_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, i)->hdr_hdl_v4) - == false) - { - res = IPACM_FAILURE; - } - } - - if(get_client_memptr(wlan_client, i)->ipv6_header_set == true) - { - if (m_header.DeleteHeaderHdl(get_client_memptr(wlan_client, i)->hdr_hdl_v6) - == false) - { - res = IPACM_FAILURE; - } - } - } /* end of for loop */ - - /* check software routing fl rule hdl */ - if (softwarerouting_act == true && rx_prop != NULL ) - { - IPACMDBG_H("Delete sw routing filtering rules\n"); - IPACM_Iface::handle_software_routing_disable(); - } - IPACMDBG_H("finished delete software-routing filtering rules\n "); - - /* Delete corresponding ipa_rm_resource_name of RX-endpoint after delete all IPV4V6 FT-rule */ - if (rx_prop != NULL) - { - IPACMDBG_H("dev %s add producer dependency\n", dev_name); - IPACMDBG_H("depend Got pipe %d rm index : %d \n", rx_prop->rx[0].src_pipe, IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - IPACM_Iface::ipacmcfg->DelRmDepend(IPACM_Iface::ipacmcfg->ipa_client_rm_map_tbl[rx_prop->rx[0].src_pipe]); - free(rx_prop); - } - - for (i = 0; i < num_wifi_client; i++) - { - if(get_client_memptr(wlan_client, i)->p_hdr_info != NULL) - { - free(get_client_memptr(wlan_client, i)->p_hdr_info); - } - } - if(wlan_client != NULL) - { - free(wlan_client); - } - if (tx_prop != NULL) - { - free(tx_prop); - } - - if (iface_query != NULL) - { - free(iface_query); - } - - is_active = false; - post_del_self_evt(); - - return res; -} - -/*handle reset wifi-client rt-rules */ -int IPACM_Wlan::handle_wlan_client_reset_rt(ipa_ip_type iptype) -{ - int i, res = IPACM_SUCCESS; - - /* clean wifi-client routing rules */ - IPACMDBG_H("left %d wifi clients to reset ip-type(%d) rules \n ", num_wifi_client, iptype); - - for (i = 0; i < num_wifi_client; i++) - { - /* Reset RT rules */ - res = delete_default_qos_rtrules(i, iptype); - if (res != IPACM_SUCCESS) - { - IPACMERR("Failed to delete old iptype(%d) rules.\n", iptype); - return res; - } - - /* Reset ip-address */ - if(iptype == IPA_IP_v4) - { - get_client_memptr(wlan_client, i)->ipv4_set = false; - } - else - { - get_client_memptr(wlan_client, i)->ipv6_set = 0; - } - } /* end of for loop */ - return res; -} - -void IPACM_Wlan::handle_SCC_MCC_switch(ipa_ip_type iptype) -{ - struct ipa_ioc_mdfy_rt_rule *rt_rule = NULL; - struct ipa_rt_rule_mdfy *rt_rule_entry; - uint32_t tx_index; - int wlan_index, v6_num; - const int NUM = 1; - int num_wifi_client_tmp = IPACM_Wlan::num_wifi_client; - bool isAdded = false; - - if (tx_prop == NULL) - { - IPACMDBG_H("No rx properties registered for iface %s\n", dev_name); - return; - } - - if (rt_rule == NULL) - { - rt_rule = (struct ipa_ioc_mdfy_rt_rule *) - calloc(1, sizeof(struct ipa_ioc_mdfy_rt_rule) + - NUM * sizeof(struct ipa_rt_rule_mdfy)); - - if (rt_rule == NULL) - { - PERROR("Error Locate ipa_ioc_mdfy_rt_rule memory...\n"); - return; - } - - rt_rule->commit = 0; - rt_rule->num_rules = NUM; - rt_rule->ip = iptype; - } - rt_rule_entry = &rt_rule->rules[0]; - - /* modify ipv4 routing rule */ - if (iptype == IPA_IP_v4) - { - for (wlan_index = 0; wlan_index < num_wifi_client_tmp; wlan_index++) - { - IPACMDBG_H("wlan client index: %d, ip-type: %d, ipv4_set:%d, ipv4_rule_set:%d \n", - wlan_index, iptype, - get_client_memptr(wlan_client, wlan_index)->ipv4_set, - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4); - - if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true || - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v4 == false) - { - IPACMDBG_H("client %d route rules not set\n", wlan_index); - continue; - } - - IPACMDBG_H("Modify client %d route rule\n", wlan_index); - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if (iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d ip-type not matching: %d ignore\n", - tx_index, tx_prop->tx[tx_index].ip, iptype); - continue; - } - - IPACMDBG_H("client index(%d):ipv4 address: 0x%x\n", wlan_index, - get_client_memptr(wlan_client, wlan_index)->v4_addr); - - IPACMDBG_H("client(%d): v4 header handle:(0x%x)\n", - wlan_index, - get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4); - - if (IPACM_Iface::ipacmcfg->isMCC_Mode) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v4; - - rt_rule_entry->rule.attrib.u.v4.dst_addr = get_client_memptr(wlan_client, wlan_index)->v4_addr; - rt_rule_entry->rule.attrib.u.v4.dst_addr_mask = 0xFFFFFFFF; - - IPACMDBG_H("tx:%d, rt rule hdl=%x ip-type: %d\n", tx_index, - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4, iptype); - - rt_rule_entry->rt_rule_hdl = - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v4; - - if (false == m_routing.ModifyRoutingRule(rt_rule)) - { - IPACMERR("Routing rule modify failed!\n"); - free(rt_rule); - return; - } - isAdded = true; - } - - } - } - - /* modify ipv6 routing rule */ - if (iptype == IPA_IP_v6) - { - for (wlan_index = 0; wlan_index < num_wifi_client_tmp; wlan_index++) - { - - IPACMDBG_H("wlan client index: %d, ip-type: %d, ipv6_set:%d, ipv6_rule_num:%d \n", wlan_index, iptype, - get_client_memptr(wlan_client, wlan_index)->ipv6_set, - get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6); - - if (get_client_memptr(wlan_client, wlan_index)->power_save_set == true || - (get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6 < - get_client_memptr(wlan_client, wlan_index)->ipv6_set) ) - { - IPACMDBG_H("client %d route rules not set\n", wlan_index); - continue; - } - - IPACMDBG_H("Modify client %d route rule\n", wlan_index); - for (tx_index = 0; tx_index < iface_query->num_tx_props; tx_index++) - { - if (iptype != tx_prop->tx[tx_index].ip) - { - IPACMDBG_H("Tx:%d, ip-type: %d ip-type not matching: %d Ignore\n", - tx_index, tx_prop->tx[tx_index].ip, iptype); - continue; - } - - for (v6_num = get_client_memptr(wlan_client, wlan_index)->route_rule_set_v6; - v6_num < get_client_memptr(wlan_client, wlan_index)->ipv6_set; - v6_num++) - { - - IPACMDBG_H("client(%d): v6 header handle:(0x%x)\n", - wlan_index, - get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6); - - if (IPACM_Iface::ipacmcfg->isMCC_Mode) - { - IPACMDBG_H("In MCC mode, use alt dst pipe: %d\n", - tx_prop->tx[tx_index].alt_dst_pipe); - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].alt_dst_pipe; - } - else - { - rt_rule_entry->rule.dst = tx_prop->tx[tx_index].dst_pipe; - } - - memcpy(&rt_rule_entry->rule.attrib, - &tx_prop->tx[tx_index].attrib, - sizeof(rt_rule_entry->rule.attrib)); - - rt_rule_entry->rule.hdr_hdl = get_client_memptr(wlan_client, wlan_index)->hdr_hdl_v6; - rt_rule_entry->rule.attrib.attrib_mask |= IPA_FLT_DST_ADDR; - - rt_rule_entry->rule.attrib.u.v6.dst_addr[0] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][0]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[1] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][1]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[2] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][2]; - rt_rule_entry->rule.attrib.u.v6.dst_addr[3] = get_client_memptr(wlan_client, wlan_index)->v6_addr[v6_num][3]; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[0] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[1] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[2] = 0xFFFFFFFF; - rt_rule_entry->rule.attrib.u.v6.dst_addr_mask[3] = 0xFFFFFFFF; - - rt_rule_entry->rt_rule_hdl = - get_client_memptr(wlan_client, wlan_index)->wifi_rt_hdl[tx_index].wifi_rt_rule_hdl_v6_wan[v6_num]; - - if (false == m_routing.ModifyRoutingRule(rt_rule)) - { - IPACMERR("Routing rule modify failed!\n"); - free(rt_rule); - return; - } - isAdded = true; - } - } - - } - } - - - if (isAdded) - { - if (false == m_routing.Commit(iptype)) - { - IPACMERR("Routing rule modify commit failed!\n"); - free(rt_rule); - return; - } - - IPACMDBG("Routing rule modified successfully \n"); - } - - if(rt_rule) - { - free(rt_rule); - } - return; -} - -void IPACM_Wlan::eth_bridge_handle_wlan_mode_switch() -{ - int i; - - /* ====== post events to mimic WLAN interface goes down/up when AP mode is changing ====== */ - - /* first post IFACE_DOWN event */ - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_DOWN, IPA_IP_MAX, NULL); - - /* then post IFACE_UP event */ - if(ip_type == IPA_IP_v4 || ip_type == IPA_IP_MAX) - { - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v4, NULL); - } - if(ip_type == IPA_IP_v6 || ip_type == IPA_IP_MAX) - { - eth_bridge_post_event(IPA_ETH_BRIDGE_IFACE_UP, IPA_IP_v6, NULL); - } - - /* at last post CLIENT_ADD event */ - for(i = 0; i < num_wifi_client; i++) - { - eth_bridge_post_event(IPA_ETH_BRIDGE_CLIENT_ADD, IPA_IP_MAX, - get_client_memptr(wlan_client, i)->mac); - } - - return; -} - -bool IPACM_Wlan::is_guest_ap() -{ - return m_is_guest_ap; -} diff --git a/ipacm/src/IPACM_Xml.cpp b/ipacm/src/IPACM_Xml.cpp deleted file mode 100644 index 120a638..0000000 --- a/ipacm/src/IPACM_Xml.cpp +++ /dev/null @@ -1,1176 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_Xml.cpp - - @brief - This file implements the XML specific parsing functionality. - - @Author - Skylar Chang/Shihuan Liu -*/ - -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include "IPACM_Xml.h" -#include "IPACM_Log.h" -#include "IPACM_Netlink.h" - -static char* IPACM_read_content_element -( - xmlNode* element -); - -static int32_t IPACM_util_icmp_string -( - const char* xml_str, - const char* str -); - -static int ipacm_cfg_xml_parse_tree -( - xmlNode* xml_node, - IPACM_conf_t *config -); - -static int IPACM_firewall_xml_parse_tree -( - xmlNode* xml_node, - IPACM_firewall_conf_t *config -); - -/*Reads content (stored as child) of the element */ -static char* IPACM_read_content_element -( - xmlNode* element -) -{ - xmlNode* child_ptr; - - for (child_ptr = element->children; - child_ptr != NULL; - child_ptr = child_ptr->next) - { - if (child_ptr->type == XML_TEXT_NODE) - { - return (char*)child_ptr->content; - } - } - return NULL; -} - -/* insensitive comparison of a libxml's string (xml_str) and a regular string (str)*/ -static int32_t IPACM_util_icmp_string -( - const char* xml_str, - const char* str -) -{ - int32_t ret = -1; - - if (NULL != xml_str && NULL != str) - { - uint32_t len1 = strlen(str); - uint32_t len2 = strlen(xml_str); - /* If the lengths match, do the string comparison */ - if (len1 == len2) - { - ret = strncasecmp(xml_str, str, len1); - } - } - - return ret; -} - -/* This function read IPACM XML and populate the IPA CM Cfg */ -int ipacm_read_cfg_xml(char *xml_file, IPACM_conf_t *config) -{ - xmlDocPtr doc = NULL; - xmlNode* root = NULL; - int ret_val = IPACM_SUCCESS; - - /* Invoke the XML parser and obtain the parse tree */ - doc = xmlReadFile(xml_file, "UTF-8", XML_PARSE_NOBLANKS); - if (doc == NULL) { - IPACMDBG_H("IPACM_xml_parse: libxml returned parse error!\n"); - return IPACM_FAILURE; - } - - /*Get the root of the tree*/ - root = xmlDocGetRootElement(doc); - - memset(config, 0, sizeof(IPACM_conf_t)); - - /* parse the xml tree returned by libxml */ - ret_val = ipacm_cfg_xml_parse_tree(root, config); - - if (ret_val != IPACM_SUCCESS) - { - IPACMDBG_H("IPACM_xml_parse: ipacm_cfg_xml_parse_tree returned parse error!\n"); - } - - /* Free up the libxml's parse tree */ - xmlFreeDoc(doc); - - return ret_val; -} - -/* This function traverses the xml tree*/ -static int ipacm_cfg_xml_parse_tree -( - xmlNode* xml_node, - IPACM_conf_t *config -) -{ - int32_t ret_val = IPACM_SUCCESS; - int str_size; - char* content; - char content_buf[MAX_XML_STR_LEN]; - - if (NULL == xml_node) - return ret_val; - while ( xml_node != NULL && - ret_val == IPACM_SUCCESS) - { - switch (xml_node->type) - { - case XML_ELEMENT_NODE: - { - if (IPACM_util_icmp_string((char*)xml_node->name, system_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, ODU_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IPACMCFG_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IPACMIFACECFG_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IFACE_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IPACMPRIVATESUBNETCFG_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, SUBNET_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IPACMALG_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, ALG_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IPACMNat_TAG) == 0 || - IPACM_util_icmp_string((char*)xml_node->name, IP_PassthroughFlag_TAG) == 0) - { - if (0 == IPACM_util_icmp_string((char*)xml_node->name, IFACE_TAG)) - { - /* increase iface entry number */ - config->iface_config.num_iface_entries++; - } - - if (0 == IPACM_util_icmp_string((char*)xml_node->name, SUBNET_TAG)) - { - /* increase iface entry number */ - config->private_subnet_config.num_subnet_entries++; - } - - if (0 == IPACM_util_icmp_string((char*)xml_node->name, ALG_TAG)) - { - /* increase iface entry number */ - config->alg_config.num_alg_entries++; - } - /* go to child */ - ret_val = ipacm_cfg_xml_parse_tree(xml_node->children, config); - } - else if (IPACM_util_icmp_string((char*)xml_node->name, IP_PassthroughMode_TAG) == 0) - { - IPACMDBG_H("inside IP Passthrough\n"); - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (atoi(content_buf)) - { - config->ip_passthrough_mode = true; - IPACMDBG_H("Passthrough enable %d buf(%d)\n", config->ip_passthrough_mode, atoi(content_buf)); - } - else - { - config->ip_passthrough_mode = false; - IPACMDBG_H("Passthrough enable %d buf(%d)\n", config->ip_passthrough_mode, atoi(content_buf)); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, ODUMODE_TAG) == 0) - { - IPACMDBG_H("inside ODU-XML\n"); - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (0 == strncasecmp(content_buf, ODU_ROUTER_TAG, str_size)) - { - config->router_mode_enable = true; - IPACMDBG_H("router-mode enable %d\n", config->router_mode_enable); - } - else if (0 == strncasecmp(content_buf, ODU_BRIDGE_TAG, str_size)) - { - config->router_mode_enable = false; - IPACMDBG_H("router-mode enable %d\n", config->router_mode_enable); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, ODUEMBMS_OFFLOAD_TAG) == 0) - { - IPACMDBG_H("inside ODU-XML\n"); - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (atoi(content_buf)) - { - config->odu_embms_enable = true; - IPACMDBG_H("router-mode enable %d buf(%d)\n", config->odu_embms_enable, atoi(content_buf)); - } - else - { - config->odu_embms_enable = false; - IPACMDBG_H("router-mode enable %d buf(%d)\n", config->odu_embms_enable, atoi(content_buf)); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, NAME_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - strlcpy(content_buf, content, MAX_XML_STR_LEN); - strlcpy(config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].iface_name, content_buf, IPA_IFACE_NAME_LEN); - IPACMDBG_H("Name %s\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].iface_name); - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, CATEGORY_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (0 == strncasecmp(content_buf, WANIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = WAN_IF; - IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - else if (0 == strncasecmp(content_buf, LANIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = LAN_IF; - IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - else if (0 == strncasecmp(content_buf, WLANIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = WLAN_IF; - IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - else if (0 == strncasecmp(content_buf, VIRTUALIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = VIRTUAL_IF; - IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - else if (0 == strncasecmp(content_buf, UNKNOWNIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = UNKNOWN_IF; - IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - else if (0 == strncasecmp(content_buf, ETHIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = ETH_IF; - IPACMDBG_H("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - else if (0 == strncasecmp(content_buf, ODUIF_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat = ODU_IF; - IPACMDBG("Category %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_cat); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, MODE_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (0 == strncasecmp(content_buf, IFACE_ROUTER_MODE_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode = ROUTER; - IPACMDBG_H("Iface mode %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode); - } - else if (0 == strncasecmp(content_buf, IFACE_BRIDGE_MODE_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode = BRIDGE; - IPACMDBG_H("Iface mode %d\n", config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].if_mode); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, WLAN_MODE_TAG) == 0) - { - IPACMDBG_H("Inside WLAN-XML\n"); - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - - if (0 == strncasecmp(content_buf, WLAN_FULL_MODE_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode = FULL; - IPACMDBG_H("Wlan-mode full(%d)\n", - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode); - } - else if (0 == strncasecmp(content_buf, WLAN_INTERNET_MODE_TAG, str_size)) - { - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode = INTERNET; - config->num_wlan_guest_ap++; - IPACMDBG_H("Wlan-mode internet(%d)\n", - config->iface_config.iface_entries[config->iface_config.num_iface_entries - 1].wlan_mode); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, SUBNETADDRESS_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - config->private_subnet_config.private_subnet_entries[config->private_subnet_config.num_subnet_entries - 1].subnet_addr - = ntohl(inet_addr(content_buf)); - IPACMDBG_H("subnet_addr: %s \n", content_buf); - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, SUBNETMASK_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - config->private_subnet_config.private_subnet_entries[config->private_subnet_config.num_subnet_entries - 1].subnet_mask - = ntohl(inet_addr(content_buf)); - IPACMDBG_H("subnet_mask: %s \n", content_buf); - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, Protocol_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - - if (0 == strncasecmp(content_buf, TCP_PROTOCOL_TAG, str_size)) - { - config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol = IPPROTO_TCP; - IPACMDBG_H("Protocol %s: %d\n", - content_buf, config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol); - } - else if (0 == strncasecmp(content_buf, UDP_PROTOCOL_TAG, str_size)) - { - config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol = IPPROTO_UDP; - IPACMDBG_H("Protocol %s: %d\n", - content_buf, config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].protocol); - } - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, Port_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].port - = atoi(content_buf); - IPACMDBG_H("port %d\n", config->alg_config.alg_entries[config->alg_config.num_alg_entries - 1].port); - } - } - else if (IPACM_util_icmp_string((char*)xml_node->name, NAT_MaxEntries_TAG) == 0) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->nat_max_entries = atoi(content_buf); - IPACMDBG_H("Nat Table Max Entries %d\n", config->nat_max_entries); - } - } - } - break; - default: - break; - } - /* go to sibling */ - xml_node = xml_node->next; - } /* end while */ - return ret_val; -} - -/* This function read QCMAP CM Firewall XML and populate the QCMAP CM Cfg */ -int IPACM_read_firewall_xml(char *xml_file, IPACM_firewall_conf_t *config) -{ - xmlDocPtr doc = NULL; - xmlNode* root = NULL; - int ret_val; - - IPACM_ASSERT(xml_file != NULL); - IPACM_ASSERT(config != NULL); - - /* invoke the XML parser and obtain the parse tree */ - doc = xmlReadFile(xml_file, "UTF-8", XML_PARSE_NOBLANKS); - if (doc == NULL) { - IPACMDBG_H("IPACM_xml_parse: libxml returned parse error\n"); - return IPACM_FAILURE; - } - /*get the root of the tree*/ - root = xmlDocGetRootElement(doc); - - /* parse the xml tree returned by libxml*/ - ret_val = IPACM_firewall_xml_parse_tree(root, config); - - if (ret_val != IPACM_SUCCESS) - { - IPACMDBG_H("IPACM_xml_parse: ipacm_firewall_xml_parse_tree returned parse error!\n"); - } - - /* free the tree */ - xmlFreeDoc(doc); - - return ret_val; -} - - -/* This function traverses the firewall xml tree */ -static int IPACM_firewall_xml_parse_tree -( - xmlNode* xml_node, - IPACM_firewall_conf_t *config -) -{ - int mask_value_v6, mask_index; - int32_t ret_val = IPACM_SUCCESS; - char *content; - int str_size; - char content_buf[MAX_XML_STR_LEN]; - struct in6_addr ip6_addr; - - IPACM_ASSERT(config != NULL); - - if (NULL == xml_node) - return ret_val; - - while ( xml_node != NULL && - ret_val == IPACM_SUCCESS) - { - switch (xml_node->type) - { - - case XML_ELEMENT_NODE: - { - if (0 == IPACM_util_icmp_string((char*)xml_node->name, system_TAG) || - 0 == IPACM_util_icmp_string((char*)xml_node->name, MobileAPFirewallCfg_TAG) || - 0 == IPACM_util_icmp_string((char*)xml_node->name, Firewall_TAG) || - 0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallEnabled_TAG) || - 0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallPktsAllowed_TAG)) - { - if (0 == IPACM_util_icmp_string((char*)xml_node->name, Firewall_TAG)) - { - /* increase firewall entry num */ - config->num_extd_firewall_entries++; - } - - if (0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallPktsAllowed_TAG)) - { - /* setup action of matched rules */ - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (atoi(content_buf)==1) - { - config->rule_action_accept = true; - } - else - { - config->rule_action_accept = false; - } - IPACMDBG_H(" Allow traffic which matches rules ?:%d\n",config->rule_action_accept); - } - } - - if (0 == IPACM_util_icmp_string((char*)xml_node->name, FirewallEnabled_TAG)) - { - /* setup if firewall enable or not */ - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (atoi(content_buf)==1) - { - config->firewall_enable = true; - } - else - { - config->firewall_enable = false; - } - IPACMDBG_H(" Firewall Enable?:%d\n", config->firewall_enable); - } - } - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPFamily_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].ip_vsn - = (firewall_ip_version_enum)atoi(content_buf); - IPACMDBG_H("\n IP family type is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].ip_vsn); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4SourceAddress_TAG)) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_ADDR; - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4SourceIPAddress_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.src_addr - = ntohl(inet_addr(content_buf)); - IPACMDBG_H("IPv4 source address is: %s \n", content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4SourceSubnetMask_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.src_addr_mask - = ntohl(inet_addr(content_buf)); - IPACMDBG_H("IPv4 source subnet mask is: %s \n", content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4DestinationAddress_TAG)) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_ADDR; - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4DestinationIPAddress_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.dst_addr - = ntohl(inet_addr(content_buf)); - IPACMDBG_H("IPv4 destination address is: %s \n", content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4DestinationSubnetMask_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - content_buf[MAX_XML_STR_LEN-1] = '\0'; - if (content_buf > 0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.dst_addr_mask - = ntohl(inet_addr(content_buf)); - IPACMDBG_H("IPv4 destination subnet mask is: %s \n", content_buf); - } - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4TypeOfService_TAG)) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_TOS; - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TOSValue_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos - = atoi(content_buf); - IPACMDBG_H("\n IPV4 TOS val is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TOSMask_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos - &= atoi(content_buf); - IPACMDBG_H("\n IPv4 TOS mask is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.tos); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV4NextHeaderProtocol_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_PROTOCOL; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.protocol = atoi(content_buf); - IPACMDBG_H("\n IPv4 next header prot is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v4.protocol); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6SourceAddress_TAG)) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= - IPA_FLT_SRC_ADDR; - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6SourceIPAddress_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - inet_pton(AF_INET6, content_buf, &ip6_addr); - memcpy(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr, - ip6_addr.s6_addr, IPACM_IPV6_ADDR_LEN * sizeof(uint8_t)); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[0]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[0]); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[1]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[1]); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[2]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[2]); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[3]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[3]); - - IPACMDBG_H("\n ipv6 source addr is %d \n ", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr[0]); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6SourcePrefix_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - mask_value_v6 = atoi(content_buf); - for (mask_index = 0; mask_index < 4; mask_index++) - { - if (mask_value_v6 >= 32) - { - mask_v6(32, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr_mask[mask_index])); - mask_value_v6 -= 32; - } - else - { - mask_v6(mask_value_v6, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.src_addr_mask[mask_index])); - mask_value_v6 = 0; - } - } - IPACMDBG_H("\n ipv6 source prefix is %d \n", atoi(content_buf)); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6DestinationAddress_TAG)) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= - IPA_FLT_DST_ADDR; - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6DestinationIPAddress_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - inet_pton(AF_INET6, content_buf, &ip6_addr); - memcpy(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr, - ip6_addr.s6_addr, IPACM_IPV6_ADDR_LEN * sizeof(uint8_t)); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[0]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[0]); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[1]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[1]); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[2]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[2]); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[3]=ntohl(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[3]); - IPACMDBG_H("\n ipv6 dest addr is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr[0]); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6DestinationPrefix_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - mask_value_v6 = atoi(content_buf); - for (mask_index = 0; mask_index < 4; mask_index++) - { - if (mask_value_v6 >= 32) - { - mask_v6(32, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr_mask[mask_index])); - mask_value_v6 -= 32; - } - else - { - mask_v6(mask_value_v6, &(config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.dst_addr_mask[mask_index])); - mask_value_v6 = 0; - } - } - IPACMDBG_H("\n ipv6 dest prefix is %d \n", atoi(content_buf)); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6TrafficClass_TAG)) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_TC; - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TrfClsValue_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.tc - = atoi(content_buf); - IPACMDBG_H("\n ipv6 trf class val is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.tc); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TrfClsMask_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.tc - &= atoi(content_buf); - IPACMDBG_H("\n ipv6 trf class mask is %d \n", atoi(content_buf)); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, IPV6NextHeaderProtocol_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_NEXT_HDR; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.next_hdr - = atoi(content_buf); - IPACMDBG_H("\n ipv6 next header protocol is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.u.v6.next_hdr); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPSource_TAG)) - { - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPSourcePort_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port - = atoi(content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPSourceRange_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if (atoi(content_buf) != 0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT_RANGE; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port + atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port = 0; - IPACMDBG_H("\n tcp source port from %d to %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo, - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi); - } - else - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT; - IPACMDBG_H("\n tcp source port= %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port); - } - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPDestination_TAG)) - { - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPDestinationPort_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port - = atoi(content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCPDestinationRange_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if(atoi(content_buf)!=0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT_RANGE; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port + atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port = 0; - IPACMDBG_H("\n tcp dest port from %d to %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo, - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi); - } - else - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT; - IPACMDBG_H("\n tcp dest port= %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port); - } - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPSource_TAG)) - { - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPSourcePort_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port - = atoi(content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPSourceRange_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if(atoi(content_buf)!=0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT_RANGE; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port + atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port = 0; - IPACMDBG_H("\n udp source port from %d to %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo, - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi); - } - else - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT; - IPACMDBG_H("\n udp source port= %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port); - } - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPDestination_TAG)) - { - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPDestinationPort_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port - = atoi(content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, UDPDestinationRange_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if(atoi(content_buf)!=0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT_RANGE; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port + atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port = 0; - IPACMDBG_H("\n UDP dest port from %d to %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo, - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi); - } - else - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT; - IPACMDBG_H("\n UDP dest port= %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port); - } - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, ICMPType_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.type = atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_TYPE; - IPACMDBG_H("\n icmp type is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.type); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, ICMPCode_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.code = atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_CODE; - IPACMDBG_H("\n icmp code is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.code); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, ESPSPI_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.spi = atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SPI; - IPACMDBG_H("\n esp spi is %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.spi); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPSource_TAG)) - { - /* go to child */ - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPSourcePort_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content,str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port - = atoi(content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPSourceRange_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if(atoi(content_buf)!=0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT_RANGE; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port + atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port = 0; - IPACMDBG_H("\n tcp_udp source port from %d to %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_lo, - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port_hi); - } - else - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_SRC_PORT; - IPACMDBG_H("\n tcp_udp source port= %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.src_port); - - } - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPDestination_TAG)) - { - ret_val = IPACM_firewall_xml_parse_tree(xml_node->children, config); - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPDestinationPort_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port - = atoi(content_buf); - } - } - else if (0 == IPACM_util_icmp_string((char*)xml_node->name, TCP_UDPDestinationRange_TAG)) - { - content = IPACM_read_content_element(xml_node); - if (content) - { - str_size = strlen(content); - memset(content_buf, 0, sizeof(content_buf)); - memcpy(content_buf, (void *)content, str_size); - if(atoi(content_buf)!=0) - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT_RANGE; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port; - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi - = config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port + atoi(content_buf); - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port = 0; - IPACMDBG_H("\n tcp_udp dest port from %d to %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_lo, - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port_hi); - } - else - { - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.attrib_mask |= IPA_FLT_DST_PORT; - IPACMDBG_H("\n tcp_udp dest port= %d \n", - config->extd_firewall_entries[config->num_extd_firewall_entries - 1].attrib.dst_port); - } - } - } - } - break; - - default: - break; - } - /* go to sibling */ - xml_node = xml_node->next; - } /* end while */ - return ret_val; -} diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml deleted file mode 100644 index 9bac7a4..0000000 --- a/ipacm/src/IPACM_cfg.xml +++ /dev/null @@ -1,175 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ipacm_cfg.xsd"> - <ODUCFG> - <OduMode>router</OduMode> - <eMBMS_offload>0</eMBMS_offload> - </ODUCFG> - <IPACM> - <IPACMIface> - <Iface> - <Name>rndis0</Name> - <Category>LAN</Category> - </Iface> - <Iface> - <Name>ecm0</Name> - <Category>LAN</Category> - <Mode>ROUTER</Mode> - </Iface> - <Iface> - <Name>rmnet_data0</Name> - <Category>WAN</Category> - <Mode>ROUTER</Mode> - </Iface> - <Iface> - <Name>rmnet_data1</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>rmnet_data2</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>rmnet_data3</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>rmnet_data4</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>rmnet_data5</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>rmnet_data6</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>rmnet_data7</Name> - <Category>WAN</Category> - </Iface> - <Iface> - <Name>softap0</Name> - <Category>UNKNOWN</Category> - <WlanMode>full</WlanMode> - </Iface> - <Iface> - <Name>wlan0</Name> - <Category>UNKNOWN</Category> - <WlanMode>full</WlanMode> - </Iface> - <Iface> - <Name>wlan1</Name> - <Category>UNKNOWN</Category> - <WlanMode>full</WlanMode> - </Iface> - <Iface> - <Name>wlan2</Name> - <Category>UNKNOWN</Category> - <WlanMode>full</WlanMode> - </Iface> - <Iface> - <Name>wlan3</Name> - <Category>UNKNOWN</Category> - <WlanMode>full</WlanMode> - </Iface> - <Iface> - <Name>eth0</Name> - <Category>ODU</Category> - </Iface> - <Iface> - <Name>bridge0</Name> - <Category>VIRTUAL</Category> - </Iface> - </IPACMIface> - <IPPassthroughFlag> - <IPPassthroughMode>0</IPPassthroughMode> - </IPPassthroughFlag> - <IPACMPrivateSubnet> - <Subnet> - <SubnetAddress>192.168.225.0</SubnetAddress> - <SubnetMask>255.255.255.0</SubnetMask> - </Subnet> - </IPACMPrivateSubnet> - <IPACMALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>21</Port> - <Description>FTP</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>554</Port> - <Description>RTSP</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>5060</Port> - <Description>SIP</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>5060</Port> - <Description>SIP</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>1723</Port> - <Description>PPTP</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>69</Port> - <Description>TFTP</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>53</Port> - <Description>DNS</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>53</Port> - <Description>DNS</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>10080</Port> - <Description>AMANDA</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>1719</Port> - <Description>H323</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>1720</Port> - <Description>H323</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>6667</Port> - <Description>IRC</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>137</Port> - <Description>NETBIOS_NS</Description> - </ALG> - <ALG> - <Protocol>UDP</Protocol> - <Port>138</Port> - <Description>NETBIOS_NS</Description> - </ALG> - <ALG> - <Protocol>TCP</Protocol> - <Port>6566</Port> - <Description>SANE</Description> - </ALG> - </IPACMALG> - <IPACMNAT> - <MaxNatEntries>500</MaxNatEntries> - </IPACMNAT> - </IPACM> -</system> diff --git a/ipacm/src/Makefile.am b/ipacm/src/Makefile.am deleted file mode 100644 index 7a62a75..0000000 --- a/ipacm/src/Makefile.am +++ /dev/null @@ -1,55 +0,0 @@ -AM_CPPFLAGS = -I./../inc \ - -I$(top_srcdir)/ipanat/inc \ - ${LIBXML_CFLAGS} -AM_CPPFLAGS += -Wall -Wundef -Wno-trigraphs -AM_CPPFLAGS += -DDEBUG -g -DFEATURE_ETH_BRIDGE_LE -AM_CPPFLAGS += -DFEATURE_IPA_V3 - -ipacm_SOURCES = IPACM_Main.cpp \ - IPACM_Conntrack_NATApp.cpp\ - IPACM_ConntrackClient.cpp \ - IPACM_ConntrackListener.cpp \ - IPACM_EvtDispatcher.cpp \ - IPACM_Config.cpp \ - IPACM_CmdQueue.cpp \ - IPACM_Log.cpp \ - IPACM_Filtering.cpp \ - IPACM_Routing.cpp \ - IPACM_Header.cpp \ - IPACM_Lan.cpp \ - IPACM_Iface.cpp \ - IPACM_Wlan.cpp \ - IPACM_Wan.cpp \ - IPACM_IfaceManager.cpp \ - IPACM_Neighbor.cpp \ - IPACM_Netlink.cpp \ - IPACM_Xml.cpp \ - IPACM_LanToLan.cpp - -bin_PROGRAMS = ipacm - -requiredlibs = ${LIBXML_LIB} -lxml2 -lpthread -lnetfilter_conntrack -lnfnetlink\ - ../../ipanat/src/libipanat.la - -AM_CPPFLAGS += "-std=c++0x" - -if USE_GLIB -ipacm_CFLAGS = $(AM_CFLAGS) -DUSE_GLIB @GLIB_CFLAGS@ -ipacm_LDFLAGS = -lpthread @GLIB_LIBS@ -ipacm_CPPFLAGS = -DUSE_GLIB $(AM_CFLAGS) $(AM_CPPFLAGS) @GLIB_CFLAGS@ -else -ipacm_CFLAGS = $(AM_CFLAGS) -ipacm_LDFLAGS = -lpthread -ipacm_CPPFLAGS = $(AM_CPPFLAGS) -endif -ipacm_LDADD = $(requiredlibs) - -LOCAL_MODULE := libipanat -LOCAL_PRELINK_MODULE := false -include $(BUILD_SHARED_LIBRARY) - -etcdir = ${sysconfdir} -etc_SCRIPTS = IPACM_cfg.xml - -init_ddir = ${sysconfdir}/init.d -init_d_SCRIPTS = start_ipacm_le diff --git a/ipacm/src/mobileap_firewall.xml b/ipacm/src/mobileap_firewall.xml deleted file mode 100644 index 84da527..0000000 --- a/ipacm/src/mobileap_firewall.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="mobileap_firewall_cfg.xsd"> - <MobileAPFirewallCfg> - <FirewallEnabled>1</FirewallEnabled> - <FirewallPktsAllowed>0</FirewallPktsAllowed> - </MobileAPFirewallCfg> -</system> diff --git a/ipacm/src/start_ipacm_le b/ipacm/src/start_ipacm_le deleted file mode 100644 index 3541a0b..0000000 --- a/ipacm/src/start_ipacm_le +++ /dev/null @@ -1,57 +0,0 @@ -#! /bin/sh -# -################################ -# Copyright (c) 2013, The Linux Foundation. All rights reserved. - -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following -# disclaimer in the documentation and/or other materials provided -# with the distribution. -# * Neither the name of The Linux Foundation nor the names of its -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. - -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -################################ - -# ipacm init.d script to start the data-ipa Software's ipacm daemon - -set -e - -case "$1" in - start) - echo -n "Starting ipacm: " - start-stop-daemon -S -b -a ipacm - echo "done" - ;; - stop) - echo -n "Stopping ipacm: " - start-stop-daemon -K -n ipacm - echo "done" - ;; - restart) - $0 stop - $0 start - ;; - *) - echo "Usage ipacm { start | stop | restart}" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/ipanat/inc/ipa_nat_drv.h b/ipanat/inc/ipa_nat_drv.h deleted file mode 100644 index 04e3af9..0000000 --- a/ipanat/inc/ipa_nat_drv.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "string.h" /* memset */ -#include "stdlib.h" /* free, malloc */ -#include "stdint.h" /* uint32_t */ - -/** - * struct ipa_nat_ipv4_rule - To hold ipv4 nat rule - * @target_ip: destination ip address - * @private_ip: private ip address - * @target_port: destination port - * @private_port: private port - * @protocol: protocol of rule (tcp/udp) - */ -typedef struct { - uint32_t target_ip; - uint32_t private_ip; - uint16_t target_port; - uint16_t private_port; - uint16_t public_port; - uint8_t protocol; -} ipa_nat_ipv4_rule; - -/** - * ipa_nat_add_ipv4_tbl() - create ipv4 nat table - * @public_ip_addr: [in] public ipv4 address - * @number_of_entries: [in] number of nat entries - * @table_handle: [out] Handle of new ipv4 nat table - * - * To create new ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_add_ipv4_tbl(uint32_t public_ip_addr, - uint16_t number_of_entries, - uint32_t *table_handle); - -/** - * ipa_nat_del_ipv4_tbl() - delete ipv4 table - * @table_handle: [in] Handle of ipv4 nat table - * - * To delete given ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_del_ipv4_tbl(uint32_t table_handle); - -/** - * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule - * @table_handle: [in] handle of ipv4 nat table - * @rule: [in] Pointer to new rule - * @rule_handle: [out] Return the handle to rule - * - * To insert new ipv4 nat rule into ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_add_ipv4_rule(uint32_t table_handle, - const ipa_nat_ipv4_rule * rule, - uint32_t *rule_handle); - -/** - * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule - * @table_handle: [in] handle of ipv4 nat table - * @rule_handle: [in] ipv4 nat rule handle - * - * To insert new ipv4 nat rule into ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_del_ipv4_rule(uint32_t table_handle, - uint32_t rule_handle); - - -/** - * ipa_nat_query_timestamp() - to query timestamp - * @table_handle: [in] handle of ipv4 nat table - * @rule_handle: [in] ipv4 nat rule handle - * @time_stamp: [out] time stamp of rule - * - * To retrieve the timestamp that lastly the - * nat rule was accessed - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_query_timestamp(uint32_t table_handle, - uint32_t rule_handle, - uint32_t *time_stamp); - diff --git a/ipanat/inc/ipa_nat_drvi.h b/ipanat/inc/ipa_nat_drvi.h deleted file mode 100644 index 6f9b1bd..0000000 --- a/ipanat/inc/ipa_nat_drvi.h +++ /dev/null @@ -1,482 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#ifndef IPA_NAT_DRVI_H -#define IPA_NAT_DRVI_H - -#include <unistd.h> -#include <stdio.h> -#include <sys/ioctl.h> -#include <fcntl.h> -#include <sys/mman.h> -#include <linux/msm_ipa.h> -#include <netinet/in.h> -#include <sys/inotify.h> -#include <errno.h> -#include <pthread.h> - -#include "ipa_nat_logi.h" - -#define NAT_DUMP - -/*======= IMPLEMENTATION related data structures and functions ======= */ -#ifdef IPA_ON_R3PC -#define NAT_MMAP_MEM_SIZE (2 * 1024UL * 1024UL - 1) -#endif - -#define IPA_DEV_NAME "/dev/ipa" -#define NAT_DEV_DIR "/dev" -#define NAT_DEV_NAME "ipaNatTable" -#define NAT_DEV_FULL_NAME "/dev/ipaNatTable" - -#define IPA_NAT_TABLE_VALID 1 -#define IPA_NAT_MAX_IP4_TBLS 1 -#define IPA_NAT_BASE_TABLE_PERCENTAGE .8 -#define IPA_NAT_EXPANSION_TABLE_PERCENTAGE .2 - -#define IPA_NAT_NUM_OF_BASE_TABLES 2 -#define IPA_NAT_UNUSED_BASE_ENTRIES 2 - -#define IPA_NAT_RULE_FLAG_FIELD_OFFSET 18 -#define IPA_NAT_RULE_NEXT_FIELD_OFFSET 8 -#define IPA_NAT_RULE_PROTO_FIELD_OFFSET 22 - -#define IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET 2 -#define IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET 0 - -#define IPA_NAT_RULE_FLAG_FIELD_SIZE 2 -#define IPA_NAT_RULE_NEXTFIELD_FIELD_SIZE 2 - -#define IPA_NAT_FLAG_ENABLE_BIT_MASK 0x8000 -#define IPA_NAT_FLAG_DISABLE_BIT_MASK 0x0000 - -#define IPA_NAT_FLAG_ENABLE_BIT 1 -#define IPA_NAT_FLAG_DISABLE_BIT 0 - -#define IPA_NAT_INVALID_PROTO_FIELD_VALUE 0xFF00 -#define IPA_NAT_INVALID_PROTO_FIELD_CMP 0xFF - -#define IPA_NAT_INVALID_INDEX 0xFF -#define IPA_NAT_INVALID_NAT_ENTRY 0x0 - -#define INDX_TBL_ENTRY_SIZE_IN_BITS 16 - -/* ----------- Rule id ----------------------- - - ------------------------------------------------ - | 3bits | 12 bits | 1 bit | - ------------------------------------------------ - | reserved | index into table | 0 - base | - | | | 1 - expansion | - ------------------------------------------------ - -*/ -#define IPA_NAT_RULE_HDL_TBL_TYPE_BITS 0x1 -#define IPA_NAT_RULE_HDL_TBL_TYPE_MASK 0x1 - -/* ----------- sw specif parameter ----- - ------------------------------------ - | 16 bits | 16 bits | - ------------------------------------ - | index table | prev index | - | entry | | - ------------------------------------ ------------------------------------------*/ -#define IPA_NAT_SW_PARAM_PREV_INDX_BYTE 0 -#define IPA_NAT_SW_PARAM_INDX_TBL_ENTRY_BYTE 1 - -typedef enum { - IPA_NAT_BASE_TBL = 0, - IPA_NAT_EXPN_TBL = 1, - IPA_NAT_INDX_TBL = 2, - IPA_NAT_INDEX_EXPN_TBL = 3, -} nat_table_type; - -typedef enum { - NEXT_INDEX_FIELD, - PUBLIC_PORT_FILED, - PRIVATE_PORT_FIELD, - TARGET_PORT_FIELD, - IP_CHKSUM_FIELD, - ENABLE_FIELD, - TIME_STAMP_FIELD, - PROTOCOL_FIELD, - TCP_UDP_CHKSUM_FIELD, - SW_SPEC_PARAM_PREV_INDEX_FIELD, - SW_SPEC_PARAM_INDX_TBL_ENTRY_FIELD, - INDX_TBL_TBL_ENTRY_FIELD, - INDX_TBL_NEXT_INDEX_FILED -} ipa_nat_rule_field_type; - -/* - --------------------------------------------- - | 3 | 2 | 1 | 0 | - --------------------------------------------- - | Public Port(2B) | Next Index(2B) | - --------------------------------------------- -*/ -typedef struct { - uint32_t next_index:16; - uint32_t public_port:16; -} next_index_pub_port; - - -/* - --------------------------------------------- - | 3 | 2 | 1 | 0 | - --------------------------------------------- - | Flags(2B) | IP check sum Diff(2B)| - |EN|FIN|Resv | | | - --------------------------------------------- -*/ -typedef struct { - uint32_t ip_chksum:16; - uint32_t rsvd1:14; - uint32_t redirect:1; - uint32_t enable:1; -} ipcksum_enbl; - - -/* - --------------------------------------- - | 7 | 6 | 5 | 4 | - --------------------------------------- - | Proto | TimeStamp(3B) | - | (1B) | | - --------------------------------------- -*/ -typedef struct { - uint32_t time_stamp:24; - uint32_t protocol:8; -} time_stamp_proto; - - -/* - --------------------------------------------- - | 3 | 2 | 1 | 0 | - --------------------------------------------- - | next_index | Table entry | - ---------------------------------------------- -*/ -typedef struct { - uint16_t tbl_entry; - uint16_t next_index; -} tbl_ent_nxt_indx; - -/*-------------------------------------------------- - 32 bit sw_spec_params is interpreted as follows - ------------------------------------ - | 16 bits | 16 bits | - ------------------------------------ - | index table | prev index | - | entry | | - ------------------------------------ ---------------------------------------------------*/ -typedef struct { - uint16_t prev_index; - uint16_t index_table_entry; -} sw_spec_params; - -/*------------------------ NAT Table Entry --------------------------------------- - - ----------------------------------------------------------------------------------- - | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | - ----------------------------------------------------------------------------------- - | Target IP(4B) | Private IP(4B) | - ----------------------------------------------------------------------------------- - |Target Port(2B) | Private Port(2B) | Public Port(2B) | Next Index(2B) | - ----------------------------------------------------------------------------------- - | Proto | TimeStamp(3B) | Flags(2B) | IP check sum Diff(2B)| - | (1B) | |EN|FIN|Resv | | | - ----------------------------------------------------------------------------------- - | TCP/UDP checksum | Reserved(2B) | SW Specific Parameters(4B) | - | diff (2B) | | - ----------------------------------------------------------------------------------- - - Dont change below structure definition. - It should be same as above(little endian order) - -------------------------------------------------------------------------------*/ -struct ipa_nat_rule { - uint64_t private_ip:32; - uint64_t target_ip:32; - - uint64_t nxt_indx_pub_port:32; - uint64_t private_port:16; - uint64_t target_port:16; - - uint64_t ip_cksm_enbl:32; - uint64_t ts_proto:32; - - /*-------------------------------------------------- - 32 bit sw_spec_params is interpreted as follows - ------------------------------------ - | 16 bits | 16 bits | - ------------------------------------ - | index table | prev index | - | entry | | - ------------------------------------ - --------------------------------------------------*/ - uint64_t sw_spec_params:32; - - uint64_t rsvd2:16; - uint64_t tcp_udp_chksum:16; -}; - -struct ipa_nat_sw_rule { - uint64_t private_ip:32; - uint64_t target_ip:32; - - uint64_t next_index:16; - uint64_t public_port:16; - uint64_t private_port:16; - uint64_t target_port:16; - - uint64_t ip_chksum:16; - uint64_t rsvd1:14; - uint64_t redirect:1; - uint64_t enable:1; - uint64_t time_stamp:24; - uint64_t protocol:8; - - /*-------------------------------------------------- - 32 bit sw_spec_params is interpreted as follows - ------------------------------------ - | 16 bits | 16 bits | - ------------------------------------ - | index table | prev index | - | entry | | - ------------------------------------ - --------------------------------------------------*/ - uint64_t prev_index:16; - uint64_t indx_tbl_entry:16; - uint64_t rsvd2:16; - uint64_t tcp_udp_chksum:16; -}; -#define IPA_NAT_TABLE_ENTRY_SIZE 32 -#define IPA_NAT_INDEX_TABLE_ENTRY_SIZE 4 - -struct ipa_nat_indx_tbl_rule { - uint32_t tbl_entry_nxt_indx; -}; - -struct ipa_nat_sw_indx_tbl_rule { - uint16_t tbl_entry; - uint16_t next_index; -}; - -struct ipa_nat_indx_tbl_meta_info { - uint16_t prev_index; -}; - -struct ipa_nat_ip4_table_cache { - uint8_t valid; - uint32_t public_addr; - - int nat_fd; - int size; - uint32_t tbl_addr_offset; - char table_name[IPA_RESOURCE_NAME_MAX]; - - char *ipv4_rules_addr; - char *index_table_addr; - uint16_t table_entries; - - char *ipv4_expn_rules_addr; - char *index_table_expn_addr; - uint16_t expn_table_entries; - - struct ipa_nat_indx_tbl_meta_info *index_expn_table_meta; - - uint16_t *rule_id_array; -#ifdef IPA_ON_R3PC - uint32_t mmap_offset; -#endif - - uint16_t cur_tbl_cnt; - uint16_t cur_expn_tbl_cnt; -}; - -struct ipa_nat_cache { - struct ipa_nat_ip4_table_cache ip4_tbl[IPA_NAT_MAX_IP4_TBLS]; - int ipa_fd; - uint8_t table_cnt; -}; - -struct ipa_nat_indx_tbl_sw_rule { - uint16_t tbl_entry; - uint16_t next_index; - uint16_t prev_index; -}; - -typedef enum { - IPA_NAT_DEL_TYPE_ONLY_ONE, - IPA_NAT_DEL_TYPE_HEAD, - IPA_NAT_DEL_TYPE_MIDDLE, - IPA_NAT_DEL_TYPE_LAST, -} del_type; - -/** - * ipa_nati_parse_ipv4_rule_hdl() - prase rule handle - * @tbl_hdl: [in] nat table rule - * @rule_hdl: [in] nat rule handle - * @expn_tbl: [out] expansion table or not - * @tbl_entry: [out] index into table - * - * Parse the rule handle to retrieve the nat table - * type and entry of nat table - * - * Returns: None - */ -void ipa_nati_parse_ipv4_rule_hdl(uint8_t tbl_hdl, - uint16_t rule_hdl, - uint8_t *expn_tbl, - uint16_t *tbl_entry); - -/** - * ipa_nati_make_rule_hdl() - makes nat rule handle - * @tbl_hdl: [in] nat table handle - * @tbl_entry: [in] nat table entry - * - * Calculate the nat rule handle which from - * nat entry which will be returned to client of - * nat driver - * - * Returns: >0 nat rule handle - */ -uint16_t ipa_nati_make_rule_hdl(uint16_t tbl_hdl, - uint16_t tbl_entry); - -uint32_t ipa_nati_get_index_entry_offset( - struct ipa_nat_ip4_table_cache*, - nat_table_type tbl_type, - uint16_t indx_tbl_entry); -uint32_t ipa_nati_get_entry_offset( - struct ipa_nat_ip4_table_cache*, - nat_table_type tbl_type, - uint16_t tbl_entry); - -int ipa_nati_add_ipv4_tbl(uint32_t public_ip_addr, - uint16_t number_of_entries, - uint32_t *table_hanle); - -int ipa_nati_alloc_table(uint16_t number_of_entries, - struct ipa_ioc_nat_alloc_mem *mem, - uint16_t*, uint16_t*); - -int ipa_nati_update_cache(struct ipa_ioc_nat_alloc_mem *, - uint32_t public_ip_addr, - uint16_t tbl_entries, - uint16_t expn_tbl_entries); - -int ipa_nati_del_ipv4_table(uint32_t tbl_hdl); -int ipa_nati_reset_ipv4_table(uint32_t tbl_hdl); -int ipa_nati_post_ipv4_init_cmd(uint8_t tbl_index); - -int ipa_nati_query_timestamp(uint32_t tbl_hdl, - uint32_t rule_hdl, - uint32_t *time_stamp); - -int ipa_nati_add_ipv4_rule(uint32_t tbl_hdl, - const ipa_nat_ipv4_rule *clnt_rule, - uint32_t *rule_hdl); - -int ipa_nati_generate_rule(uint32_t tbl_hdl, - const ipa_nat_ipv4_rule *clnt_rule, - struct ipa_nat_sw_rule *rule, - struct ipa_nat_indx_tbl_sw_rule *index_sw_rule, - uint16_t *tbl_entry, - uint16_t *indx_tbl_entry); - -uint16_t ipa_nati_expn_tbl_free_entry(struct ipa_nat_rule *expn_tbl, - uint16_t size); - -uint16_t ipa_nati_generate_tbl_rule(const ipa_nat_ipv4_rule *clnt_rule, - struct ipa_nat_sw_rule *sw_rule, - struct ipa_nat_ip4_table_cache *tbl_ptr); - -uint16_t ipa_nati_generate_index_rule(const ipa_nat_ipv4_rule *clnt_rule, - struct ipa_nat_indx_tbl_sw_rule *sw_rule, - struct ipa_nat_ip4_table_cache *tbl_ptr); - -uint16_t ipa_nati_index_expn_get_free_entry(struct ipa_nat_indx_tbl_rule *tbl, - uint16_t size); - -void ipa_nati_copy_ipv4_rule_to_hw( - struct ipa_nat_ip4_table_cache *ipv4_cache, - struct ipa_nat_sw_rule *rule, - uint16_t entry, uint8_t tbl_index); - -void ipa_nati_copy_ipv4_index_rule_to_hw( - struct ipa_nat_ip4_table_cache *ipv4_cache, - struct ipa_nat_indx_tbl_sw_rule *indx_sw_rule, - uint16_t entry, uint8_t tbl_index); - -void ipa_nati_write_next_index(uint8_t tbl_indx, - nat_table_type tbl_type, - uint16_t value, - uint32_t offset); - -int ipa_nati_post_ipv4_dma_cmd(uint8_t tbl_indx, - uint16_t entry); - -int ipa_nati_del_ipv4_rule(uint32_t tbl_hdl, - uint32_t rule_hdl); - -int ipa_nati_post_del_dma_cmd(uint8_t tbl_indx, - uint16_t tbl_entry, - uint8_t expn_tbl, - del_type rule_pos); - -void ipa_nati_find_index_rule_pos( - struct ipa_nat_ip4_table_cache *cache_ptr, - uint16_t tbl_entry, - del_type *rule_pos); - -void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx); -void ipa_nati_find_rule_pos(struct ipa_nat_ip4_table_cache *cache_ptr, - uint8_t expn_tbl, - uint16_t tbl_entry, - del_type *rule_pos); -void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx); - -uint16_t Read16BitFieldValue(uint32_t param, - ipa_nat_rule_field_type fld_type); - -/* ======================================================== - Debug functions - ========================================================*/ -#ifdef NAT_DUMP -void ipa_nati_print_rule(struct ipa_nat_rule*, uint32_t); -void ipa_nat_dump_ipv4_table(uint32_t); -void ipa_nati_print_index_rule(struct ipa_nat_indx_tbl_rule*, - uint32_t, uint16_t); -int ipa_nati_query_nat_rules(uint32_t, nat_table_type); -#endif - -#endif /* #ifndef IPA_NAT_DRVI_H */ diff --git a/ipanat/inc/ipa_nat_logi.h b/ipanat/inc/ipa_nat_logi.h deleted file mode 100644 index 5f79cc6..0000000 --- a/ipanat/inc/ipa_nat_logi.h +++ /dev/null @@ -1,73 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - ipa_nat_logi.h - - @brief - This file implements the IPAM log functionality. - - @Author - - -*/ - -#ifndef IPA_NAT_LOGI_H -#define IPA_NAT_LOGI_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include <stdio.h> -#include <string.h> -#include <syslog.h> - -#define PERROR(fmt) printf("%s:%d %s()", __FILE__, __LINE__, __FUNCTION__);\ - perror(fmt); - -#define IPAERR(fmt, ...) printf("ERR: %s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); - -#ifdef DEBUG -#define IPADBG(fmt, ...) printf("%s:%d %s() " fmt, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); - -#define IPADUMP(fmt, ...) printf(fmt, ##__VA_ARGS__); - -#else -#define IPADBG(fmt, ...) -#define IPADUMP(fmt, ...) -#endif - - -#ifdef __cplusplus -} -#endif - -#endif /* IPA_NAT_LOGI_H */ diff --git a/ipanat/src/Android.mk b/ipanat/src/Android.mk deleted file mode 100644 index 21037f0..0000000 --- a/ipanat/src/Android.mk +++ /dev/null @@ -1,30 +0,0 @@ -BOARD_PLATFORM_LIST := msm8916 -BOARD_PLATFORM_LIST += msm8909 -ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true) -ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM))) -ifneq (, $(filter aarch64 arm arm64, $(TARGET_ARCH))) - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_C_INCLUDES := $(LOCAL_PATH)/../inc -LOCAL_C_INCLUDES += $(LOCAL_PATH) -ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) -LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -endif - -LOCAL_SRC_FILES := ipa_nat_drv.c \ - ipa_nat_drvi.c - -LOCAL_CFLAGS := -DDEBUG -LOCAL_MODULE := libipanat -LOCAL_MODULE_TAGS := optional -LOCAL_PRELINK_MODULE := false -LOCAL_CLANG := true -include $(BUILD_SHARED_LIBRARY) - -endif # $(TARGET_ARCH) -endif -endif diff --git a/ipanat/src/Makefile.am b/ipanat/src/Makefile.am deleted file mode 100644 index 8bdb9b8..0000000 --- a/ipanat/src/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -AM_CFLAGS = -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -AM_CFLAGS += -I./../inc -#AM_CFLAGS += -DDEBUG -g - -common_CFLAGS = -DUSE_GLIB @GLIB_CFLAGS@ -common_LDFLAGS = -lrt @GLIB_LIBS@ - -c_sources = ipa_nat_drv.c \ - ipa_nat_drvi.c \ - ipa_nat_logi.c - -library_includedir = $(pkgincludedir) -library_include_HEADERS = ./../inc/ipa_nat_drvi.h \ - ./../inc/ipa_nat_drv.h \ - ./../inc/ipa_nat_logi.h - -lib_LTLIBRARIES = libipanat.la -libipanat_la_C = @C@ -libipanat_la_SOURCES = $(c_sources) -libipanat_la_CFLAGS = $(AM_CFLAGS) $(common_CFLAGS) -libipanat_la_LDFLAGS = -shared $(common_LDFLAGS) -version-info 1:0:0 diff --git a/ipanat/src/ipa_nat_drv.c b/ipanat/src/ipa_nat_drv.c deleted file mode 100644 index 66504e1..0000000 --- a/ipanat/src/ipa_nat_drv.c +++ /dev/null @@ -1,175 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ipa_nat_drv.h" -#include "ipa_nat_drvi.h" - -/** - * ipa_nat_add_ipv4_tbl() - create ipv4 nat table - * @public_ip_addr: [in] public ipv4 address - * @number_of_entries: [in] number of nat entries - * @table_handle: [out] Handle of new ipv4 nat table - * - * To create new ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_add_ipv4_tbl(uint32_t public_ip_addr, - uint16_t number_of_entries, - uint32_t *tbl_hdl) -{ - int ret; - - if (NULL == tbl_hdl || 0 == number_of_entries) { - IPAERR("Invalid parameters \n"); - return -EINVAL; - } - - ret = ipa_nati_add_ipv4_tbl(public_ip_addr, - number_of_entries, - tbl_hdl); - if (ret != 0) { - IPAERR("unable to add table \n"); - return -EINVAL; - } - IPADBG("Returning table handle 0x%x\n", *tbl_hdl); - - return ret; -} /* __ipa_nat_add_ipv4_tbl() */ - -/** - * ipa_nat_del_ipv4_tbl() - delete ipv4 table - * @table_handle: [in] Handle of ipv4 nat table - * - * To delete given ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_del_ipv4_tbl(uint32_t tbl_hdl) -{ - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - tbl_hdl > IPA_NAT_MAX_IP4_TBLS) { - IPAERR("invalid table handle passed \n"); - return -EINVAL; - } - IPADBG("Passed Table Handle: 0x%x\n", tbl_hdl); - - return ipa_nati_del_ipv4_table(tbl_hdl); -} - -/** - * ipa_nat_add_ipv4_rule() - to insert new ipv4 rule - * @table_handle: [in] handle of ipv4 nat table - * @rule: [in] Pointer to new rule - * @rule_handle: [out] Return the handle to rule - * - * To insert new ipv4 nat rule into ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_add_ipv4_rule(uint32_t tbl_hdl, - const ipa_nat_ipv4_rule *clnt_rule, - uint32_t *rule_hdl) -{ - int result = -EINVAL; - - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - tbl_hdl > IPA_NAT_MAX_IP4_TBLS || NULL == rule_hdl || - NULL == clnt_rule) { - IPAERR("invalide table handle passed \n"); - return result; - } - IPADBG("Passed Table handle: 0x%x\n", tbl_hdl); - - if (ipa_nati_add_ipv4_rule(tbl_hdl, clnt_rule, rule_hdl) != 0) { - return result; - } - - IPADBG("returning rule handle 0x%x\n", *rule_hdl); - return 0; -} - - -/** - * ipa_nat_del_ipv4_rule() - to delete ipv4 nat rule - * @table_handle: [in] handle of ipv4 nat table - * @rule_handle: [in] ipv4 nat rule handle - * - * To insert new ipv4 nat rule into ipv4 nat table - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_del_ipv4_rule(uint32_t tbl_hdl, - uint32_t rule_hdl) -{ - int result = -EINVAL; - - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - IPA_NAT_INVALID_NAT_ENTRY == rule_hdl) { - IPAERR("invalide parameters\n"); - return result; - } - IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", tbl_hdl, rule_hdl); - - result = ipa_nati_del_ipv4_rule(tbl_hdl, rule_hdl); - if (result) { - IPAERR("unable to delete rule from hw \n"); - return result; - } - - return 0; -} - -/** - * ipa_nat_query_timestamp() - to query timestamp - * @table_handle: [in] handle of ipv4 nat table - * @rule_handle: [in] ipv4 nat rule handle - * @time_stamp: [out] time stamp of rule - * - * To retrieve the timestamp that lastly the - * nat rule was accessed - * - * Returns: 0 On Success, negative on failure - */ -int ipa_nat_query_timestamp(uint32_t tbl_hdl, - uint32_t rule_hdl, - uint32_t *time_stamp) -{ - - if (0 == tbl_hdl || tbl_hdl > IPA_NAT_MAX_IP4_TBLS || - NULL == time_stamp) { - IPAERR("invalid parameters passed \n"); - return -EINVAL; - } - IPADBG("Passed Table: 0x%x and rule handle 0x%x\n", tbl_hdl, rule_hdl); - - return ipa_nati_query_timestamp(tbl_hdl, rule_hdl, time_stamp); -} - - diff --git a/ipanat/src/ipa_nat_drvi.c b/ipanat/src/ipa_nat_drvi.c deleted file mode 100644 index 9b96c44..0000000 --- a/ipanat/src/ipa_nat_drvi.c +++ /dev/null @@ -1,2368 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "ipa_nat_drv.h" -#include "ipa_nat_drvi.h" - -#ifdef USE_GLIB -#include <glib.h> -#define strlcpy g_strlcpy -#endif - -struct ipa_nat_cache ipv4_nat_cache; -pthread_mutex_t nat_mutex = PTHREAD_MUTEX_INITIALIZER; - -/* ------------------------------------------ - UTILITY FUNCTIONS START - --------------------------------------------*/ - -/** - * UpdateSwSpecParams() - updates sw specific params - * @rule: [in/out] nat table rule - * @param_type: [in] which param need to update - * @value: [in] value of param - * - * Update SW specific params in the passed rule. - * - * Returns: None - */ -void UpdateSwSpecParams(struct ipa_nat_rule *rule, - uint8_t param_type, - uint32_t value) -{ - uint32_t temp = rule->sw_spec_params; - - if (IPA_NAT_SW_PARAM_INDX_TBL_ENTRY_BYTE == param_type) { - value = (value << INDX_TBL_ENTRY_SIZE_IN_BITS); - temp &= 0x0000FFFF; - } else { - temp &= 0xFFFF0000; - } - - temp = (temp | value); - rule->sw_spec_params = temp; - return; -} - -/** - * Read8BitFieldValue() - * @rule: [in/out] - * @param_type: [in] - * @value: [in] - * - * - * - * Returns: None - */ - -uint8_t Read8BitFieldValue(uint32_t param, - ipa_nat_rule_field_type fld_type) -{ - void *temp = (void *)¶m; - - switch (fld_type) { - - case PROTOCOL_FIELD: - return ((time_stamp_proto *)temp)->protocol; - - default: - IPAERR("Invalid Field type passed\n"); - return 0; - } -} - -uint16_t Read16BitFieldValue(uint32_t param, - ipa_nat_rule_field_type fld_type) -{ - void *temp = (void *)¶m; - - switch (fld_type) { - - case NEXT_INDEX_FIELD: - return ((next_index_pub_port *)temp)->next_index; - - case PUBLIC_PORT_FILED: - return ((next_index_pub_port *)temp)->public_port; - - case ENABLE_FIELD: - return ((ipcksum_enbl *)temp)->enable; - - case SW_SPEC_PARAM_PREV_INDEX_FIELD: - return ((sw_spec_params *)temp)->prev_index; - - case SW_SPEC_PARAM_INDX_TBL_ENTRY_FIELD: - return ((sw_spec_params *)temp)->index_table_entry; - - case INDX_TBL_TBL_ENTRY_FIELD: - return ((tbl_ent_nxt_indx *)temp)->tbl_entry; - - case INDX_TBL_NEXT_INDEX_FILED: - return ((tbl_ent_nxt_indx *)temp)->next_index; - -#ifdef NAT_DUMP - case IP_CHKSUM_FIELD: - return ((ipcksum_enbl *)temp)->ip_chksum; -#endif - - default: - IPAERR("Invalid Field type passed\n"); - return 0; - } -} - -uint32_t Read32BitFieldValue(uint32_t param, - ipa_nat_rule_field_type fld_type) -{ - - void *temp = (void *)¶m; - - switch (fld_type) { - - case TIME_STAMP_FIELD: - return ((time_stamp_proto *)temp)->time_stamp; - - default: - IPAERR("Invalid Field type passed\n"); - return 0; - } -} - - -/** - * CreateNatDevice() - Create nat devices - * @mem: [in] name of device that need to create - * - * Create Nat device and Register for file create - * notification in given directory and wait till - * receive notification - * - * Returns: 0 on success, negative on failure - */ -int CreateNatDevice(struct ipa_ioc_nat_alloc_mem *mem) -{ - int ret; - - ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_ALLOC_NAT_MEM, mem); - if (ret != 0) { - perror("CreateNatDevice(): ioctl error value"); - IPAERR("unable to post nat mem init. Error ;%d\n", ret); - IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - return -EINVAL; - } - IPADBG("posted IPA_IOC_ALLOC_NAT_MEM to kernel successfully\n"); - return 0; -} - -/** - * GetNearest2Power() - Returns the nearest power of 2 - * @num: [in] given number - * @ret: [out] nearest power of 2 - * - * Returns the nearest power of 2 for a - * given number - * - * Returns: 0 on success, negative on failure - */ -int GetNearest2Power(uint16_t num, uint16_t *ret) -{ - uint16_t number = num; - uint16_t tmp = 1; - *ret = 0; - - if (0 == num) { - return -EINVAL; - } - - if (1 == num) { - *ret = 2; - return 0; - } - - for (;;) { - if (1 == num) { - if (number != tmp) { - tmp *= 2; - } - - *ret = tmp; - return 0; - } - - num >>= 1; - tmp *= 2; - } - - return -EINVAL; -} - -/** - * GetNearestEven() - Returns the nearest even number - * @num: [in] given number - * @ret: [out] nearest even number - * - * Returns the nearest even number for a given number - * - * Returns: 0 on success, negative on failure - */ -void GetNearestEven(uint16_t num, uint16_t *ret) -{ - - if (num < 2) { - *ret = 2; - return; - } - - while ((num % 2) != 0) { - num = num + 1; - } - - *ret = num; - return; -} - -/** - * dst_hash() - Find the index into ipv4 base table - * @trgt_ip: [in] Target IP address - * @trgt_port: [in] Target port - * @public_port: [in] Public port - * @proto: [in] Protocol (TCP/IP) - * @size: [in] size of the ipv4 base Table - * - * This hash method is used to find the hash index of new nat - * entry into ipv4 base table. In case of zero index, the - * new entry will be stored into N-1 index where N is size of - * ipv4 base table - * - * Returns: >0 index into ipv4 base table, negative on failure - */ -static uint16_t dst_hash(uint32_t trgt_ip, uint16_t trgt_port, - uint16_t public_port, uint8_t proto, - uint16_t size) -{ - uint16_t hash = ((uint16_t)(trgt_ip)) ^ ((uint16_t)(trgt_ip >> 16)) ^ - (trgt_port) ^ (public_port) ^ (proto); - - IPADBG("trgt_ip: 0x%x trgt_port: 0x%x\n", trgt_ip, trgt_port); - IPADBG("public_port: 0x%x\n", public_port); - IPADBG("proto: 0x%x size: 0x%x\n", proto, size); - - hash = (hash & size); - - /* If the hash resulted to zero then set it to maximum value - as zero is unused entry in nat tables */ - if (0 == hash) { - return size; - } - - IPADBG("dst_hash returning value: %d\n", hash); - return hash; -} - -/** - * src_hash() - Find the index into ipv4 index base table - * @priv_ip: [in] Private IP address - * @priv_port: [in] Private port - * @trgt_ip: [in] Target IP address - * @trgt_port: [in] Target Port - * @proto: [in] Protocol (TCP/IP) - * @size: [in] size of the ipv4 index base Table - * - * This hash method is used to find the hash index of new nat - * entry into ipv4 index base table. In case of zero index, the - * new entry will be stored into N-1 index where N is size of - * ipv4 index base table - * - * Returns: >0 index into ipv4 index base table, negative on failure - */ -static uint16_t src_hash(uint32_t priv_ip, uint16_t priv_port, - uint32_t trgt_ip, uint16_t trgt_port, - uint8_t proto, uint16_t size) -{ - uint16_t hash = ((uint16_t)(priv_ip)) ^ ((uint16_t)(priv_ip >> 16)) ^ - (priv_port) ^ - ((uint16_t)(trgt_ip)) ^ ((uint16_t)(trgt_ip >> 16)) ^ - (trgt_port) ^ (proto); - - IPADBG("priv_ip: 0x%x priv_port: 0x%x\n", priv_ip, priv_port); - IPADBG("trgt_ip: 0x%x trgt_port: 0x%x\n", trgt_ip, trgt_port); - IPADBG("proto: 0x%x size: 0x%x\n", proto, size); - - hash = (hash & size); - - /* If the hash resulted to zero then set it to maximum value - as zero is unused entry in nat tables */ - if (0 == hash) { - return size; - } - - IPADBG("src_hash returning value: %d\n", hash); - return hash; -} - -/** - * ipa_nati_calc_ip_cksum() - Calculate the source nat - * IP checksum diff - * @pub_ip_addr: [in] public ip address - * @priv_ip_addr: [in] Private ip address - * - * source nat ip checksum different is calculated as - * public_ip_addr - private_ip_addr - * Here we are using 1's complement to represent -ve number. - * So take 1's complement of private ip addr and add it - * to public ip addr. - * - * Returns: >0 ip checksum diff - */ -static uint16_t ipa_nati_calc_ip_cksum(uint32_t pub_ip_addr, - uint32_t priv_ip_addr) -{ - uint16_t ret; - uint32_t cksum = 0; - - /* Add LSB(2 bytes) of public ip address to cksum */ - cksum += (pub_ip_addr & 0xFFFF); - - /* Add MSB(2 bytes) of public ip address to cksum - and check for carry forward(CF), if any add it - */ - cksum += (pub_ip_addr>>16); - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Calculate the 1's complement of private ip address */ - priv_ip_addr = (~priv_ip_addr); - - /* Add LSB(2 bytes) of private ip address to cksum - and check for carry forward(CF), if any add it - */ - cksum += (priv_ip_addr & 0xFFFF); - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Add MSB(2 bytes) of private ip address to cksum - and check for carry forward(CF), if any add it - */ - cksum += (priv_ip_addr>>16); - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Return the LSB(2 bytes) of checksum */ - ret = (uint16_t)cksum; - return ret; -} - -/** - * ipa_nati_calc_tcp_udp_cksum() - Calculate the source nat - * TCP/UDP checksum diff - * @pub_ip_addr: [in] public ip address - * @pub_port: [in] public tcp/udp port - * @priv_ip_addr: [in] Private ip address - * @priv_port: [in] Private tcp/udp prot - * - * source nat tcp/udp checksum is calculated as - * (pub_ip_addr + pub_port) - (priv_ip_addr + priv_port) - * Here we are using 1's complement to represent -ve number. - * So take 1's complement of prviate ip addr &private port - * and add it public ip addr & public port. - * - * Returns: >0 tcp/udp checksum diff - */ -static uint16_t ipa_nati_calc_tcp_udp_cksum(uint32_t pub_ip_addr, - uint16_t pub_port, - uint32_t priv_ip_addr, - uint16_t priv_port) -{ - uint16_t ret = 0; - uint32_t cksum = 0; - - /* Add LSB(2 bytes) of public ip address to cksum */ - cksum += (pub_ip_addr & 0xFFFF); - - /* Add MSB(2 bytes) of public ip address to cksum - and check for carry forward(CF), if any add it - */ - cksum += (pub_ip_addr>>16); - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Add public port to cksum and - check for carry forward(CF), if any add it */ - cksum += pub_port; - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Calculate the 1's complement of private ip address */ - priv_ip_addr = (~priv_ip_addr); - - /* Add LSB(2 bytes) of private ip address to cksum - and check for carry forward(CF), if any add it - */ - cksum += (priv_ip_addr & 0xFFFF); - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Add MSB(2 bytes) of private ip address to cksum - and check for carry forward(CF), if any add - */ - cksum += (priv_ip_addr>>16); - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* Calculate the 1's complement of private port */ - priv_port = (~priv_port); - - /* Add public port to cksum and - check for carry forward(CF), if any add it */ - cksum += priv_port; - if (cksum >> 16) { - cksum = (cksum & 0x0000FFFF); - cksum += 1; - } - - /* return the LSB(2 bytes) of checksum */ - ret = (uint16_t)cksum; - return ret; -} - -/** - * ipa_nati_make_rule_hdl() - makes nat rule handle - * @tbl_hdl: [in] nat table handle - * @tbl_entry: [in] nat table entry - * - * Calculate the nat rule handle which from - * nat entry which will be returned to client of - * nat driver - * - * Returns: >0 nat rule handle - */ -uint16_t ipa_nati_make_rule_hdl(uint16_t tbl_hdl, - uint16_t tbl_entry) -{ - struct ipa_nat_ip4_table_cache *tbl_ptr; - uint16_t rule_hdl = 0; - uint16_t cnt = 0; - - tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_hdl-1]; - - if (tbl_entry >= tbl_ptr->table_entries) { - /* Increase the current expansion table count */ - tbl_ptr->cur_expn_tbl_cnt++; - - /* Update the index into table */ - rule_hdl = tbl_entry - tbl_ptr->table_entries; - rule_hdl = (rule_hdl << IPA_NAT_RULE_HDL_TBL_TYPE_BITS); - /* Update the table type mask */ - rule_hdl = (rule_hdl | IPA_NAT_RULE_HDL_TBL_TYPE_MASK); - } else { - /* Increase the current count */ - tbl_ptr->cur_tbl_cnt++; - - rule_hdl = tbl_entry; - rule_hdl = (rule_hdl << IPA_NAT_RULE_HDL_TBL_TYPE_BITS); - } - - for (; cnt < (tbl_ptr->table_entries + tbl_ptr->expn_table_entries); cnt++) { - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_ptr->rule_id_array[cnt]) { - tbl_ptr->rule_id_array[cnt] = rule_hdl; - return cnt + 1; - } - } - - return 0; -} - -/** - * ipa_nati_parse_ipv4_rule_hdl() - prase rule handle - * @tbl_hdl: [in] nat table rule - * @rule_hdl: [in] nat rule handle - * @expn_tbl: [out] expansion table or not - * @tbl_entry: [out] index into table - * - * Parse the rule handle to retrieve the nat table - * type and entry of nat table - * - * Returns: None - */ -void ipa_nati_parse_ipv4_rule_hdl(uint8_t tbl_index, - uint16_t rule_hdl, uint8_t *expn_tbl, - uint16_t *tbl_entry) -{ - struct ipa_nat_ip4_table_cache *tbl_ptr; - uint16_t rule_id; - - *expn_tbl = 0; - *tbl_entry = IPA_NAT_INVALID_NAT_ENTRY; - tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_index]; - - if (rule_hdl >= (tbl_ptr->table_entries + tbl_ptr->expn_table_entries)) { - IPAERR("invalid rule handle\n"); - return; - } - - rule_id = tbl_ptr->rule_id_array[rule_hdl-1]; - - /* Retrieve the table type */ - *expn_tbl = 0; - if (rule_id & IPA_NAT_RULE_HDL_TBL_TYPE_MASK) { - *expn_tbl = 1; - } - - /* Retrieve the table entry */ - *tbl_entry = (rule_id >> IPA_NAT_RULE_HDL_TBL_TYPE_BITS); - return; -} - -uint32_t ipa_nati_get_entry_offset(struct ipa_nat_ip4_table_cache *cache_ptr, - nat_table_type tbl_type, - uint16_t tbl_entry) -{ - struct ipa_nat_rule *tbl_ptr; - uint32_t ret = 0; - - if (IPA_NAT_EXPN_TBL == tbl_type) { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr; - } else { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr; - } - - ret = (char *)&tbl_ptr[tbl_entry] - (char *)tbl_ptr; - ret += cache_ptr->tbl_addr_offset; - return ret; -} - -uint32_t ipa_nati_get_index_entry_offset(struct ipa_nat_ip4_table_cache *cache_ptr, - nat_table_type tbl_type, - uint16_t indx_tbl_entry) -{ - struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; - uint32_t ret = 0; - - if (IPA_NAT_INDEX_EXPN_TBL == tbl_type) { - indx_tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr; - } else { - indx_tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr; - } - - ret = (char *)&indx_tbl_ptr[indx_tbl_entry] - (char *)indx_tbl_ptr; - ret += cache_ptr->tbl_addr_offset; - return ret; -} - -/* ------------------------------------------ - UTILITY FUNCTIONS END ---------------------------------------------*/ - -/* ------------------------------------------ - Main Functions ---------------------------------------------**/ -void ipa_nati_reset_tbl(uint8_t tbl_indx) -{ - uint16_t table_entries = ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries; - uint16_t expn_table_entries = ipv4_nat_cache.ip4_tbl[tbl_indx].expn_table_entries; - - /* Base table */ - IPADBG("memset() base table to 0, %p\n", - ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr); - - memset(ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr, - 0, - IPA_NAT_TABLE_ENTRY_SIZE * table_entries); - - /* Base expansino table */ - IPADBG("memset() expn base table to 0, %p\n", - ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_expn_rules_addr); - - memset(ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_expn_rules_addr, - 0, - IPA_NAT_TABLE_ENTRY_SIZE * expn_table_entries); - - /* Index table */ - IPADBG("memset() index table to 0, %p\n", - ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_addr); - - memset(ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_addr, - 0, - IPA_NAT_INDEX_TABLE_ENTRY_SIZE * table_entries); - - /* Index expansion table */ - IPADBG("memset() index expn table to 0, %p\n", - ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_expn_addr); - - memset(ipv4_nat_cache.ip4_tbl[tbl_indx].index_table_expn_addr, - 0, - IPA_NAT_INDEX_TABLE_ENTRY_SIZE * expn_table_entries); - - IPADBG("returning from ipa_nati_reset_tbl()\n"); - return; -} - -int ipa_nati_add_ipv4_tbl(uint32_t public_ip_addr, - uint16_t number_of_entries, - uint32_t *tbl_hdl) -{ - struct ipa_ioc_nat_alloc_mem mem; - uint8_t tbl_indx = ipv4_nat_cache.table_cnt; - uint16_t table_entries, expn_table_entries; - int ret; - - *tbl_hdl = 0; - /* Allocate table */ - memset(&mem, 0, sizeof(mem)); - ret = ipa_nati_alloc_table(number_of_entries, - &mem, - &table_entries, - &expn_table_entries); - if (0 != ret) { - IPAERR("unable to allocate nat table\n"); - return -ENOMEM; - } - - /* Update the cache - The (IPA_NAT_UNUSED_BASE_ENTRIES/2) indicates zero entry entries - for both base and expansion table - */ - ret = ipa_nati_update_cache(&mem, - public_ip_addr, - table_entries, - expn_table_entries); - if (0 != ret) { - IPAERR("unable to update cache Error: %d\n", ret); - return -EINVAL; - } - - /* Reset the nat table before posting init cmd */ - ipa_nati_reset_tbl(tbl_indx); - - /* Initialize the ipa hw with nat table dimensions */ - ret = ipa_nati_post_ipv4_init_cmd(tbl_indx); - if (0 != ret) { - IPAERR("unable to post nat_init command Error %d\n", ret); - return -EINVAL; - } - - /* Return table handle */ - ipv4_nat_cache.table_cnt++; - *tbl_hdl = ipv4_nat_cache.table_cnt; - -#ifdef NAT_DUMP - ipa_nat_dump_ipv4_table(*tbl_hdl); -#endif - return 0; -} - -int ipa_nati_alloc_table(uint16_t number_of_entries, - struct ipa_ioc_nat_alloc_mem *mem, - uint16_t *table_entries, - uint16_t *expn_table_entries) -{ - int fd = 0, ret; - uint16_t total_entries; - - /* Copy the table name */ - strlcpy(mem->dev_name, NAT_DEV_NAME, IPA_RESOURCE_NAME_MAX); - - /* Calculate the size for base table and expansion table */ - *table_entries = (uint16_t)(number_of_entries * IPA_NAT_BASE_TABLE_PERCENTAGE); - if (*table_entries == 0) { - *table_entries = 1; - } - if (GetNearest2Power(*table_entries, table_entries)) { - IPAERR("unable to calculate power of 2\n"); - return -EINVAL; - } - - *expn_table_entries = (uint16_t)(number_of_entries * IPA_NAT_EXPANSION_TABLE_PERCENTAGE); - GetNearestEven(*expn_table_entries, expn_table_entries); - - total_entries = (*table_entries)+(*expn_table_entries); - - /* Calclate the memory size for both table and index table entries */ - mem->size = (IPA_NAT_TABLE_ENTRY_SIZE * total_entries); - IPADBG("Nat Table size: %d\n", mem->size); - mem->size += (IPA_NAT_INDEX_TABLE_ENTRY_SIZE * total_entries); - IPADBG("Nat Base and Index Table size: %d\n", mem->size); - - if (!ipv4_nat_cache.ipa_fd) { - fd = open(IPA_DEV_NAME, O_RDONLY); - if (fd < 0) { - perror("ipa_nati_alloc_table(): open error value:"); - IPAERR("unable to open ipa device\n"); - return -EIO; - } - ipv4_nat_cache.ipa_fd = fd; - } - - ret = CreateNatDevice(mem); - return ret; -} - - -int ipa_nati_update_cache(struct ipa_ioc_nat_alloc_mem *mem, - uint32_t public_addr, - uint16_t tbl_entries, - uint16_t expn_tbl_entries) -{ - uint32_t index = ipv4_nat_cache.table_cnt; - char *ipv4_rules_addr = NULL; - - int fd = 0; - int flags = MAP_SHARED; - int prot = PROT_READ | PROT_WRITE; - off_t offset = 0; -#ifdef IPA_ON_R3PC - int ret = 0; - uint32_t nat_mem_offset = 0; -#endif - - ipv4_nat_cache.ip4_tbl[index].valid = IPA_NAT_TABLE_VALID; - ipv4_nat_cache.ip4_tbl[index].public_addr = public_addr; - ipv4_nat_cache.ip4_tbl[index].size = mem->size; - ipv4_nat_cache.ip4_tbl[index].tbl_addr_offset = mem->offset; - - ipv4_nat_cache.ip4_tbl[index].table_entries = tbl_entries; - ipv4_nat_cache.ip4_tbl[index].expn_table_entries = expn_tbl_entries; - - IPADBG("num of ipv4 rules:%d\n", tbl_entries); - IPADBG("num of ipv4 expn rules:%d\n", expn_tbl_entries); - - /* allocate memory for nat index expansion table */ - if (NULL == ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta) { - ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta = - malloc(sizeof(struct ipa_nat_indx_tbl_meta_info) * expn_tbl_entries); - - if (NULL == ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta) { - IPAERR("Fail to allocate ipv4 index expansion table meta\n"); - return 0; - } - - memset(ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta, - 0, - sizeof(struct ipa_nat_indx_tbl_meta_info) * expn_tbl_entries); - } - - /* Allocate memory for rule_id_array */ - if (NULL == ipv4_nat_cache.ip4_tbl[index].rule_id_array) { - ipv4_nat_cache.ip4_tbl[index].rule_id_array = - malloc(sizeof(uint16_t) * (tbl_entries + expn_tbl_entries)); - - if (NULL == ipv4_nat_cache.ip4_tbl[index].rule_id_array) { - IPAERR("Fail to allocate rule id array\n"); - return 0; - } - - memset(ipv4_nat_cache.ip4_tbl[index].rule_id_array, - 0, - sizeof(uint16_t) * (tbl_entries + expn_tbl_entries)); - } - - - /* open the nat table */ - strlcpy(mem->dev_name, NAT_DEV_FULL_NAME, IPA_RESOURCE_NAME_MAX); - fd = open(mem->dev_name, O_RDWR); - if (fd < 0) { - perror("ipa_nati_update_cache(): open error value:"); - IPAERR("unable to open nat device. Error:%d\n", fd); - return -EIO; - } - - /* copy the nat table name */ - strlcpy(ipv4_nat_cache.ip4_tbl[index].table_name, - mem->dev_name, - IPA_RESOURCE_NAME_MAX); - ipv4_nat_cache.ip4_tbl[index].nat_fd = fd; - - /* open the nat device Table */ -#ifndef IPA_ON_R3PC - ipv4_rules_addr = (void *)mmap(NULL, mem->size, - prot, flags, - fd, offset); -#else - IPADBG("user space r3pc\n"); - ipv4_rules_addr = (void *)mmap((caddr_t)0, NAT_MMAP_MEM_SIZE, - prot, flags, - fd, offset); -#endif - if (MAP_FAILED == ipv4_rules_addr) { - perror("unable to mmap the memory\n"); - return -EINVAL; - } - -#ifdef IPA_ON_R3PC - ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_GET_NAT_OFFSET, &nat_mem_offset); - if (ret != 0) { - perror("ipa_nati_post_ipv4_init_cmd(): ioctl error value"); - IPAERR("unable to post ant offset cmd Error: %d\n", ret); - IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - return -EIO; - } - ipv4_rules_addr += nat_mem_offset; - ipv4_nat_cache.ip4_tbl[index].mmap_offset = nat_mem_offset; -#endif - - IPADBG("mmap return value 0x%lx\n", (long unsigned int)ipv4_rules_addr); - - ipv4_nat_cache.ip4_tbl[index].ipv4_rules_addr = ipv4_rules_addr; - - ipv4_nat_cache.ip4_tbl[index].ipv4_expn_rules_addr = - ipv4_rules_addr + (IPA_NAT_TABLE_ENTRY_SIZE * tbl_entries); - - ipv4_nat_cache.ip4_tbl[index].index_table_addr = - ipv4_rules_addr + (IPA_NAT_TABLE_ENTRY_SIZE * (tbl_entries + expn_tbl_entries)); - - ipv4_nat_cache.ip4_tbl[index].index_table_expn_addr = - ipv4_rules_addr + - (IPA_NAT_TABLE_ENTRY_SIZE * (tbl_entries + expn_tbl_entries))+ - (IPA_NAT_INDEX_TABLE_ENTRY_SIZE * tbl_entries); - - return 0; -} - -/* comment: check the implementation once - offset should be in terms of byes */ -int ipa_nati_post_ipv4_init_cmd(uint8_t tbl_index) -{ - struct ipa_ioc_v4_nat_init cmd; - uint32_t offset = ipv4_nat_cache.ip4_tbl[tbl_index].tbl_addr_offset; - int ret; - - cmd.tbl_index = tbl_index; - - cmd.ipv4_rules_offset = offset; - cmd.expn_rules_offset = cmd.ipv4_rules_offset + - (ipv4_nat_cache.ip4_tbl[tbl_index].table_entries * IPA_NAT_TABLE_ENTRY_SIZE); - - cmd.index_offset = cmd.expn_rules_offset + - (ipv4_nat_cache.ip4_tbl[tbl_index].expn_table_entries * IPA_NAT_TABLE_ENTRY_SIZE); - - cmd.index_expn_offset = cmd.index_offset + - (ipv4_nat_cache.ip4_tbl[tbl_index].table_entries * IPA_NAT_INDEX_TABLE_ENTRY_SIZE); - - cmd.table_entries = ipv4_nat_cache.ip4_tbl[tbl_index].table_entries - 1; - cmd.expn_table_entries = ipv4_nat_cache.ip4_tbl[tbl_index].expn_table_entries; - - cmd.ip_addr = ipv4_nat_cache.ip4_tbl[tbl_index].public_addr; - - ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_V4_INIT_NAT, &cmd); - if (ret != 0) { - perror("ipa_nati_post_ipv4_init_cmd(): ioctl error value"); - IPAERR("unable to post init cmd Error: %d\n", ret); - IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - return -EINVAL; - } - IPADBG("Posted IPA_IOC_V4_INIT_NAT to kernel successfully\n"); - - return 0; -} - -int ipa_nati_del_ipv4_table(uint32_t tbl_hdl) -{ - uint8_t index = (uint8_t)(tbl_hdl - 1); - void *addr = (void *)ipv4_nat_cache.ip4_tbl[index].ipv4_rules_addr; - struct ipa_ioc_v4_nat_del del_cmd; - int ret; - - if (!ipv4_nat_cache.ip4_tbl[index].valid) { - IPAERR("invalid table handle passed\n"); - ret = -EINVAL; - goto fail; - } - - if (pthread_mutex_lock(&nat_mutex) != 0) { - ret = -1; - goto lock_mutex_fail; - } - - /* unmap the device memory from user space */ -#ifndef IPA_ON_R3PC - munmap(addr, ipv4_nat_cache.ip4_tbl[index].size); -#else - addr = (char *)addr - ipv4_nat_cache.ip4_tbl[index].mmap_offset; - munmap(addr, NAT_MMAP_MEM_SIZE); -#endif - - /* close the file descriptor of nat device */ - if (close(ipv4_nat_cache.ip4_tbl[index].nat_fd)) { - IPAERR("unable to close the file descriptor\n"); - ret = -EINVAL; - if (pthread_mutex_unlock(&nat_mutex) != 0) - goto unlock_mutex_fail; - goto fail; - } - - del_cmd.table_index = index; - del_cmd.public_ip_addr = ipv4_nat_cache.ip4_tbl[index].public_addr; - ret = ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_V4_DEL_NAT, &del_cmd); - if (ret != 0) { - perror("ipa_nati_del_ipv4_table(): ioctl error value"); - IPAERR("unable to post nat del command init Error: %d\n", ret); - IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - ret = -EINVAL; - if (pthread_mutex_unlock(&nat_mutex) != 0) - goto unlock_mutex_fail; - goto fail; - } - IPAERR("posted IPA_IOC_V4_DEL_NAT to kernel successfully\n"); - - free(ipv4_nat_cache.ip4_tbl[index].index_expn_table_meta); - free(ipv4_nat_cache.ip4_tbl[index].rule_id_array); - - memset(&ipv4_nat_cache.ip4_tbl[index], - 0, - sizeof(ipv4_nat_cache.ip4_tbl[index])); - - /* Decrease the table count by 1*/ - ipv4_nat_cache.table_cnt--; - - if (pthread_mutex_unlock(&nat_mutex) != 0) { - ret = -1; - goto unlock_mutex_fail; - } - - return 0; - -lock_mutex_fail: - IPAERR("unable to lock the nat mutex\n"); - return ret; - -unlock_mutex_fail: - IPAERR("unable to unlock the nat mutex\n"); - -fail: - return ret; -} - -int ipa_nati_query_timestamp(uint32_t tbl_hdl, - uint32_t rule_hdl, - uint32_t *time_stamp) -{ - uint8_t tbl_index = (uint8_t)(tbl_hdl - 1); - uint8_t expn_tbl = 0; - uint16_t tbl_entry = 0; - struct ipa_nat_rule *tbl_ptr = NULL; - - if (!ipv4_nat_cache.ip4_tbl[tbl_index].valid) { - IPAERR("invalid table handle\n"); - return -EINVAL; - } - - if (pthread_mutex_lock(&nat_mutex) != 0) { - IPAERR("unable to lock the nat mutex\n"); - return -1; - } - - ipa_nati_parse_ipv4_rule_hdl(tbl_index, (uint16_t)rule_hdl, - &expn_tbl, &tbl_entry); - - tbl_ptr = - (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_index].ipv4_rules_addr; - if (expn_tbl) { - tbl_ptr = - (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_index].ipv4_expn_rules_addr; - } - - if (tbl_ptr) - *time_stamp = Read32BitFieldValue(tbl_ptr[tbl_entry].ts_proto, - TIME_STAMP_FIELD); - - if (pthread_mutex_unlock(&nat_mutex) != 0) { - IPAERR("unable to unlock the nat mutex\n"); - return -1; - } - - return 0; -} - -int ipa_nati_add_ipv4_rule(uint32_t tbl_hdl, - const ipa_nat_ipv4_rule *clnt_rule, - uint32_t *rule_hdl) -{ - struct ipa_nat_ip4_table_cache *tbl_ptr; - struct ipa_nat_sw_rule sw_rule; - struct ipa_nat_indx_tbl_sw_rule index_sw_rule; - uint16_t new_entry, new_index_tbl_entry; - - memset(&sw_rule, 0, sizeof(sw_rule)); - memset(&index_sw_rule, 0, sizeof(index_sw_rule)); - - /* Generate rule from client input */ - if (ipa_nati_generate_rule(tbl_hdl, clnt_rule, - &sw_rule, &index_sw_rule, - &new_entry, &new_index_tbl_entry)) { - IPAERR("unable to generate rule\n"); - return -EINVAL; - } - - tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_hdl-1]; - ipa_nati_copy_ipv4_rule_to_hw(tbl_ptr, &sw_rule, new_entry, (uint8_t)(tbl_hdl-1)); - ipa_nati_copy_ipv4_index_rule_to_hw(tbl_ptr, - &index_sw_rule, - new_index_tbl_entry, - (uint8_t)(tbl_hdl-1)); - - IPADBG("new entry:%d, new index entry: %d\n", new_entry, new_index_tbl_entry); - if (ipa_nati_post_ipv4_dma_cmd((uint8_t)(tbl_hdl - 1), new_entry)) { - IPAERR("unable to post dma command\n"); - return -EIO; - } - - /* Generate rule handle */ - *rule_hdl = ipa_nati_make_rule_hdl((uint16_t)tbl_hdl, new_entry); - if (!(*rule_hdl)) { - IPAERR("unable to generate rule handle\n"); - return -EINVAL; - } - -#ifdef NAT_DUMP - ipa_nat_dump_ipv4_table(tbl_hdl); -#endif - - return 0; -} - -int ipa_nati_generate_rule(uint32_t tbl_hdl, - const ipa_nat_ipv4_rule *clnt_rule, - struct ipa_nat_sw_rule *rule, - struct ipa_nat_indx_tbl_sw_rule *index_sw_rule, - uint16_t *tbl_entry, - uint16_t *indx_tbl_entry) -{ - struct ipa_nat_ip4_table_cache *tbl_ptr; - uint16_t tmp; - - if (NULL == clnt_rule || NULL == index_sw_rule || - NULL == rule || NULL == tbl_entry || - NULL == indx_tbl_entry) { - IPAERR("invalid parameters\n"); - return -EINVAL; - } - - tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_hdl-1]; - - *tbl_entry = ipa_nati_generate_tbl_rule(clnt_rule, - rule, - tbl_ptr); - if (IPA_NAT_INVALID_NAT_ENTRY == *tbl_entry) { - IPAERR("unable to generate table entry\n"); - return -EINVAL; - } - - index_sw_rule->tbl_entry = *tbl_entry; - *indx_tbl_entry = ipa_nati_generate_index_rule(clnt_rule, - index_sw_rule, - tbl_ptr); - if (IPA_NAT_INVALID_NAT_ENTRY == *indx_tbl_entry) { - IPAERR("unable to generate index table entry\n"); - return -EINVAL; - } - - rule->indx_tbl_entry = *indx_tbl_entry; - if (*indx_tbl_entry >= tbl_ptr->table_entries) { - tmp = *indx_tbl_entry - tbl_ptr->table_entries; - tbl_ptr->index_expn_table_meta[tmp].prev_index = index_sw_rule->prev_index; - } - - return 0; -} - -uint16_t ipa_nati_generate_tbl_rule(const ipa_nat_ipv4_rule *clnt_rule, - struct ipa_nat_sw_rule *sw_rule, - struct ipa_nat_ip4_table_cache *tbl_ptr) -{ - uint32_t pub_ip_addr; - uint16_t prev = 0, nxt_indx = 0, new_entry; - struct ipa_nat_rule *tbl = NULL, *expn_tbl = NULL; - - pub_ip_addr = tbl_ptr->public_addr; - - tbl = (struct ipa_nat_rule *)tbl_ptr->ipv4_rules_addr; - expn_tbl = (struct ipa_nat_rule *)tbl_ptr->ipv4_expn_rules_addr; - - /* copy the values from client rule to sw rule */ - sw_rule->private_ip = clnt_rule->private_ip; - sw_rule->private_port = clnt_rule->private_port; - sw_rule->protocol = clnt_rule->protocol; - sw_rule->public_port = clnt_rule->public_port; - sw_rule->target_ip = clnt_rule->target_ip; - sw_rule->target_port = clnt_rule->target_port; - - /* consider only public and private ip fields */ - sw_rule->ip_chksum = ipa_nati_calc_ip_cksum(pub_ip_addr, - clnt_rule->private_ip); - - if (IPPROTO_TCP == sw_rule->protocol || - IPPROTO_UDP == sw_rule->protocol) { - /* consider public and private ip & port fields */ - sw_rule->tcp_udp_chksum = ipa_nati_calc_tcp_udp_cksum( - pub_ip_addr, - clnt_rule->public_port, - clnt_rule->private_ip, - clnt_rule->private_port); - } - - sw_rule->rsvd1 = 0; - sw_rule->enable = IPA_NAT_FLAG_DISABLE_BIT; - sw_rule->next_index = 0; - - /* - SW sets this timer to 0. - The assumption is that 0 is an invalid clock value and no clock - wraparounds are expected - */ - sw_rule->time_stamp = 0; - sw_rule->rsvd2 = 0; - sw_rule->prev_index = 0; - sw_rule->indx_tbl_entry = 0; - - new_entry = dst_hash(clnt_rule->target_ip, - clnt_rule->target_port, - clnt_rule->public_port, - clnt_rule->protocol, - tbl_ptr->table_entries-1); - - /* check whether there is any collision - if no collision return */ - if (!Read16BitFieldValue(tbl[new_entry].ip_cksm_enbl, - ENABLE_FIELD)) { - sw_rule->prev_index = 0; - IPADBG("Destination Nat New Entry Index %d\n", new_entry); - return new_entry; - } - - /* First collision */ - if (Read16BitFieldValue(tbl[new_entry].nxt_indx_pub_port, - NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) { - sw_rule->prev_index = new_entry; - } else { /* check for more than one collision */ - /* Find the IPA_NAT_DEL_TYPE_LAST entry in list */ - nxt_indx = Read16BitFieldValue(tbl[new_entry].nxt_indx_pub_port, - NEXT_INDEX_FIELD); - - while (nxt_indx != IPA_NAT_INVALID_NAT_ENTRY) { - prev = nxt_indx; - - nxt_indx -= tbl_ptr->table_entries; - nxt_indx = Read16BitFieldValue(expn_tbl[nxt_indx].nxt_indx_pub_port, - NEXT_INDEX_FIELD); - - /* Handling error case */ - if (prev == nxt_indx) { - IPAERR("Error: Prev index:%d and next:%d index should not be same\n", prev, nxt_indx); - return IPA_NAT_INVALID_NAT_ENTRY; - } - } - - sw_rule->prev_index = prev; - } - - /* On collision check for the free entry in expansion table */ - new_entry = ipa_nati_expn_tbl_free_entry(expn_tbl, - tbl_ptr->expn_table_entries); - - if (IPA_NAT_INVALID_NAT_ENTRY == new_entry) { - /* Expansion table is full return*/ - IPAERR("Expansion table is full\n"); - IPAERR("Current Table: %d & Expn Entries: %d\n", - tbl_ptr->cur_tbl_cnt, tbl_ptr->cur_expn_tbl_cnt); - return IPA_NAT_INVALID_NAT_ENTRY; - } - new_entry += tbl_ptr->table_entries; - - IPADBG("new entry index %d\n", new_entry); - return new_entry; -} - -/* returns expn table entry index */ -uint16_t ipa_nati_expn_tbl_free_entry(struct ipa_nat_rule *expn_tbl, - uint16_t size) -{ - int cnt; - - for (cnt = 1; cnt < size; cnt++) { - if (!Read16BitFieldValue(expn_tbl[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - IPADBG("new expansion table entry index %d\n", cnt); - return cnt; - } - } - - IPAERR("nat expansion table is full\n"); - return 0; -} - -uint16_t ipa_nati_generate_index_rule(const ipa_nat_ipv4_rule *clnt_rule, - struct ipa_nat_indx_tbl_sw_rule *sw_rule, - struct ipa_nat_ip4_table_cache *tbl_ptr) -{ - struct ipa_nat_indx_tbl_rule *indx_tbl, *indx_expn_tbl; - uint16_t prev = 0, nxt_indx = 0, new_entry; - - indx_tbl = - (struct ipa_nat_indx_tbl_rule *)tbl_ptr->index_table_addr; - indx_expn_tbl = - (struct ipa_nat_indx_tbl_rule *)tbl_ptr->index_table_expn_addr; - - new_entry = src_hash(clnt_rule->private_ip, - clnt_rule->private_port, - clnt_rule->target_ip, - clnt_rule->target_port, - clnt_rule->protocol, - tbl_ptr->table_entries-1); - - /* check whether there is any collision - if no collision return */ - if (!Read16BitFieldValue(indx_tbl[new_entry].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - sw_rule->prev_index = 0; - IPADBG("Source Nat Index Table Entry %d\n", new_entry); - return new_entry; - } - - /* check for more than one collision */ - if (Read16BitFieldValue(indx_tbl[new_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED) == IPA_NAT_INVALID_NAT_ENTRY) { - sw_rule->prev_index = new_entry; - IPADBG("First collosion. Entry %d\n", new_entry); - } else { - /* Find the IPA_NAT_DEL_TYPE_LAST entry in list */ - nxt_indx = Read16BitFieldValue(indx_tbl[new_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - while (nxt_indx != IPA_NAT_INVALID_NAT_ENTRY) { - prev = nxt_indx; - - nxt_indx -= tbl_ptr->table_entries; - nxt_indx = Read16BitFieldValue(indx_expn_tbl[nxt_indx].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - /* Handling error case */ - if (prev == nxt_indx) { - IPAERR("Error: Prev:%d and next:%d index should not be same\n", prev, nxt_indx); - return IPA_NAT_INVALID_NAT_ENTRY; - } - } - - sw_rule->prev_index = prev; - } - - /* On collision check for the free entry in expansion table */ - new_entry = ipa_nati_index_expn_get_free_entry(indx_expn_tbl, - tbl_ptr->expn_table_entries); - - if (IPA_NAT_INVALID_NAT_ENTRY == new_entry) { - /* Expansion table is full return*/ - IPAERR("Index expansion table is full\n"); - IPAERR("Current Table: %d & Expn Entries: %d\n", - tbl_ptr->cur_tbl_cnt, tbl_ptr->cur_expn_tbl_cnt); - return IPA_NAT_INVALID_NAT_ENTRY; - } - new_entry += tbl_ptr->table_entries; - - - if (sw_rule->prev_index == new_entry) { - IPAERR("Error: prev_entry:%d ", sw_rule->prev_index); - IPAERR("and new_entry:%d should not be same ", new_entry); - IPAERR("infinite loop detected\n"); - return IPA_NAT_INVALID_NAT_ENTRY; - } - - IPADBG("index table entry %d\n", new_entry); - return new_entry; -} - -/* returns index expn table entry index */ -uint16_t ipa_nati_index_expn_get_free_entry( - struct ipa_nat_indx_tbl_rule *indx_tbl, - uint16_t size) -{ - int cnt; - for (cnt = 1; cnt < size; cnt++) { - if (!Read16BitFieldValue(indx_tbl[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - return cnt; - } - } - - IPAERR("nat index expansion table is full\n"); - return 0; -} - -void ipa_nati_write_next_index(uint8_t tbl_indx, - nat_table_type tbl_type, - uint16_t value, - uint32_t offset) -{ - struct ipa_ioc_nat_dma_cmd *cmd; - - IPADBG("Updating next index field of table %d on collosion using dma\n", tbl_type); - IPADBG("table index: %d, value: %d offset;%d\n", tbl_indx, value, offset); - - cmd = (struct ipa_ioc_nat_dma_cmd *) - malloc(sizeof(struct ipa_ioc_nat_dma_cmd)+ - sizeof(struct ipa_ioc_nat_dma_one)); - if (NULL == cmd) { - IPAERR("unable to allocate memory\n"); - return; - } - - cmd->dma[0].table_index = tbl_indx; - cmd->dma[0].base_addr = tbl_type; - cmd->dma[0].data = value; - cmd->dma[0].offset = offset; - - cmd->entries = 1; - if (ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_NAT_DMA, cmd)) { - perror("ipa_nati_post_ipv4_dma_cmd(): ioctl error value"); - IPAERR("unable to call dma icotl to update next index\n"); - IPAERR("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - goto fail; - } - -fail: - free(cmd); - - return; -} - -void ipa_nati_copy_ipv4_rule_to_hw( - struct ipa_nat_ip4_table_cache *ipv4_cache, - struct ipa_nat_sw_rule *rule, - uint16_t entry, uint8_t tbl_index) -{ - struct ipa_nat_rule *tbl_ptr; - uint16_t prev_entry = rule->prev_index; - nat_table_type tbl_type; - uint32_t offset = 0; - - if (entry < ipv4_cache->table_entries) { - tbl_ptr = (struct ipa_nat_rule *)ipv4_cache->ipv4_rules_addr; - - memcpy(&tbl_ptr[entry], - rule, - sizeof(struct ipa_nat_rule)); - } else { - tbl_ptr = (struct ipa_nat_rule *)ipv4_cache->ipv4_expn_rules_addr; - memcpy(&tbl_ptr[entry - ipv4_cache->table_entries], - rule, - sizeof(struct ipa_nat_rule)); - } - - /* Update the previos entry next_index */ - if (IPA_NAT_INVALID_NAT_ENTRY != prev_entry) { - - if (prev_entry < ipv4_cache->table_entries) { - tbl_type = IPA_NAT_BASE_TBL; - tbl_ptr = (struct ipa_nat_rule *)ipv4_cache->ipv4_rules_addr; - } else { - tbl_type = IPA_NAT_EXPN_TBL; - /* tbp_ptr is already pointing to expansion table - no need to initialize it */ - prev_entry = prev_entry - ipv4_cache->table_entries; - } - - offset = ipa_nati_get_entry_offset(ipv4_cache, tbl_type, prev_entry); - offset += IPA_NAT_RULE_NEXT_FIELD_OFFSET; - - ipa_nati_write_next_index(tbl_index, tbl_type, entry, offset); - } - - return; -} - -void ipa_nati_copy_ipv4_index_rule_to_hw( - struct ipa_nat_ip4_table_cache *ipv4_cache, - struct ipa_nat_indx_tbl_sw_rule *indx_sw_rule, - uint16_t entry, - uint8_t tbl_index) -{ - struct ipa_nat_indx_tbl_rule *tbl_ptr; - struct ipa_nat_sw_indx_tbl_rule sw_rule; - uint16_t prev_entry = indx_sw_rule->prev_index; - nat_table_type tbl_type; - uint16_t offset = 0; - - sw_rule.next_index = indx_sw_rule->next_index; - sw_rule.tbl_entry = indx_sw_rule->tbl_entry; - - if (entry < ipv4_cache->table_entries) { - tbl_ptr = (struct ipa_nat_indx_tbl_rule *)ipv4_cache->index_table_addr; - - memcpy(&tbl_ptr[entry], - &sw_rule, - sizeof(struct ipa_nat_indx_tbl_rule)); - } else { - tbl_ptr = (struct ipa_nat_indx_tbl_rule *)ipv4_cache->index_table_expn_addr; - - memcpy(&tbl_ptr[entry - ipv4_cache->table_entries], - &sw_rule, - sizeof(struct ipa_nat_indx_tbl_rule)); - } - - /* Update the next field of previous entry on collosion */ - if (IPA_NAT_INVALID_NAT_ENTRY != prev_entry) { - if (prev_entry < ipv4_cache->table_entries) { - tbl_type = IPA_NAT_INDX_TBL; - tbl_ptr = (struct ipa_nat_indx_tbl_rule *)ipv4_cache->index_table_addr; - } else { - tbl_type = IPA_NAT_INDEX_EXPN_TBL; - /* tbp_ptr is already pointing to expansion table - no need to initialize it */ - prev_entry = prev_entry - ipv4_cache->table_entries; - } - - offset = ipa_nati_get_index_entry_offset(ipv4_cache, tbl_type, prev_entry); - offset += IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET; - - IPADBG("Updating next index field of index table on collosion using dma()\n"); - ipa_nati_write_next_index(tbl_index, tbl_type, entry, offset); - } - - return; -} - -int ipa_nati_post_ipv4_dma_cmd(uint8_t tbl_indx, - uint16_t entry) -{ - struct ipa_ioc_nat_dma_cmd *cmd; - struct ipa_nat_rule *tbl_ptr; - uint32_t offset = ipv4_nat_cache.ip4_tbl[tbl_indx].tbl_addr_offset; - int ret = 0; - - cmd = (struct ipa_ioc_nat_dma_cmd *) - malloc(sizeof(struct ipa_ioc_nat_dma_cmd)+ - sizeof(struct ipa_ioc_nat_dma_one)); - if (NULL == cmd) { - IPAERR("unable to allocate memory\n"); - return -ENOMEM; - } - - if (entry < ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries) { - tbl_ptr = - (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr; - - cmd->dma[0].table_index = tbl_indx; - cmd->dma[0].base_addr = IPA_NAT_BASE_TBL; - cmd->dma[0].data = IPA_NAT_FLAG_ENABLE_BIT_MASK; - - cmd->dma[0].offset = (char *)&tbl_ptr[entry] - (char *)tbl_ptr; - cmd->dma[0].offset += IPA_NAT_RULE_FLAG_FIELD_OFFSET; - } else { - tbl_ptr = - (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_expn_rules_addr; - entry = entry - ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries; - - cmd->dma[0].table_index = tbl_indx; - cmd->dma[0].base_addr = IPA_NAT_EXPN_TBL; - cmd->dma[0].data = IPA_NAT_FLAG_ENABLE_BIT_MASK; - - cmd->dma[0].offset = (char *)&tbl_ptr[entry] - (char *)tbl_ptr; - cmd->dma[0].offset += IPA_NAT_RULE_FLAG_FIELD_OFFSET; - cmd->dma[0].offset += offset; - } - - cmd->entries = 1; - if (ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_NAT_DMA, cmd)) { - perror("ipa_nati_post_ipv4_dma_cmd(): ioctl error value"); - IPAERR("unable to call dma icotl\n"); - IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - ret = -EIO; - goto fail; - } - IPADBG("posted IPA_IOC_NAT_DMA to kernel successfully during add operation\n"); - - -fail: - free(cmd); - - return ret; -} - - -int ipa_nati_del_ipv4_rule(uint32_t tbl_hdl, - uint32_t rule_hdl) -{ - uint8_t expn_tbl; - uint16_t tbl_entry; - struct ipa_nat_ip4_table_cache *tbl_ptr; - del_type rule_pos; - uint8_t tbl_indx = (uint8_t)(tbl_hdl - 1); - int ret; - - /* Parse the rule handle */ - ipa_nati_parse_ipv4_rule_hdl(tbl_indx, (uint16_t)rule_hdl, - &expn_tbl, &tbl_entry); - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_entry) { - IPAERR("Invalid Rule Entry\n"); - ret = -EINVAL; - goto fail; - } - - if (pthread_mutex_lock(&nat_mutex) != 0) { - ret = -1; - goto mutex_lock_error; - } - - IPADBG("Delete below rule\n"); - IPADBG("tbl_entry:%d expn_tbl:%d\n", tbl_entry, expn_tbl); - - tbl_ptr = &ipv4_nat_cache.ip4_tbl[tbl_indx]; - if (!tbl_ptr->valid) { - IPAERR("invalid table handle\n"); - ret = -EINVAL; - if (pthread_mutex_unlock(&nat_mutex) != 0) - goto mutex_unlock_error; - goto fail; - } - - ipa_nati_find_rule_pos(tbl_ptr, expn_tbl, - tbl_entry, &rule_pos); - IPADBG("rule_pos:%d\n", rule_pos); - - if (ipa_nati_post_del_dma_cmd(tbl_indx, tbl_entry, - expn_tbl, rule_pos)) { - ret = -EINVAL; - if (pthread_mutex_unlock(&nat_mutex) != 0) - goto mutex_unlock_error; - goto fail; - } - - ipa_nati_del_dead_ipv4_head_nodes(tbl_indx); - - /* Reset rule_id_array entry */ - ipv4_nat_cache.ip4_tbl[tbl_indx].rule_id_array[rule_hdl-1] = - IPA_NAT_INVALID_NAT_ENTRY; - -#ifdef NAT_DUMP - IPADBG("Dumping Table after deleting rule\n"); - ipa_nat_dump_ipv4_table(tbl_hdl); -#endif - - if (pthread_mutex_unlock(&nat_mutex) != 0) { - ret = -1; - goto mutex_unlock_error; - } - - return 0; - -mutex_lock_error: - IPAERR("unable to lock the nat mutex\n"); - return ret; - -mutex_unlock_error: - IPAERR("unable to unlock the nat mutex\n"); - -fail: - return ret; -} - -void ReorderCmds(struct ipa_ioc_nat_dma_cmd *cmd, int size) -{ - int indx_tbl_start = 0, cnt, cnt1; - struct ipa_ioc_nat_dma_cmd *tmp; - - IPADBG("called ReorderCmds() with entries :%d\n", cmd->entries); - - for (cnt = 0; cnt < cmd->entries; cnt++) { - if (cmd->dma[cnt].base_addr == IPA_NAT_INDX_TBL || - cmd->dma[cnt].base_addr == IPA_NAT_INDEX_EXPN_TBL) { - indx_tbl_start = cnt; - break; - } - } - - if (indx_tbl_start == 0) { - IPADBG("Reorder not needed\n"); - return; - } - - tmp = (struct ipa_ioc_nat_dma_cmd *)malloc(size); - if (tmp == NULL) { - IPAERR("unable to allocate memory\n"); - return; - } - - cnt1 = 0; - tmp->entries = cmd->entries; - for (cnt = indx_tbl_start; cnt < cmd->entries; cnt++) { - tmp->dma[cnt1] = cmd->dma[cnt]; - cnt1++; - } - - for (cnt = 0; cnt < indx_tbl_start; cnt++) { - tmp->dma[cnt1] = cmd->dma[cnt]; - cnt1++; - } - - memset(cmd, 0, size); - memcpy(cmd, tmp, size); - free(tmp); - - return; -} - -int ipa_nati_post_del_dma_cmd(uint8_t tbl_indx, - uint16_t cur_tbl_entry, - uint8_t expn_tbl, - del_type rule_pos) -{ - -#define MAX_DMA_ENTRIES_FOR_DEL 3 - - struct ipa_nat_ip4_table_cache *cache_ptr; - struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; - struct ipa_nat_rule *tbl_ptr; - int ret = 0, size = 0; - - uint16_t indx_tbl_entry = IPA_NAT_INVALID_NAT_ENTRY; - del_type indx_rule_pos; - - struct ipa_ioc_nat_dma_cmd *cmd; - uint8_t no_of_cmds = 0; - - uint16_t prev_entry = IPA_NAT_INVALID_NAT_ENTRY; - uint16_t next_entry = IPA_NAT_INVALID_NAT_ENTRY; - uint16_t indx_next_entry = IPA_NAT_INVALID_NAT_ENTRY; - uint16_t indx_next_next_entry = IPA_NAT_INVALID_NAT_ENTRY; - uint16_t table_entry; - - size = sizeof(struct ipa_ioc_nat_dma_cmd)+ - (MAX_DMA_ENTRIES_FOR_DEL * sizeof(struct ipa_ioc_nat_dma_one)); - - cmd = (struct ipa_ioc_nat_dma_cmd *)malloc(size); - if (NULL == cmd) { - IPAERR("unable to allocate memory\n"); - return -ENOMEM; - } - - cache_ptr = &ipv4_nat_cache.ip4_tbl[tbl_indx]; - if (!expn_tbl) { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr; - } else { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr; - } - - - if (!Read16BitFieldValue(tbl_ptr[cur_tbl_entry].ip_cksm_enbl, - ENABLE_FIELD)) { - IPAERR("Deleting invalid(not enabled) rule\n"); - ret = -EINVAL; - goto fail; - } - - indx_tbl_entry = - Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params, - SW_SPEC_PARAM_INDX_TBL_ENTRY_FIELD); - - /* ================================================ - Base Table rule Deletion - ================================================*/ - /* Just delete the current rule by disabling the flag field */ - if (IPA_NAT_DEL_TYPE_ONLY_ONE == rule_pos) { - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL; - cmd->dma[no_of_cmds].data = IPA_NAT_FLAG_DISABLE_BIT_MASK; - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, - cur_tbl_entry); - cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_FLAG_FIELD_OFFSET; - } - - /* Just update the protocol field to invalid */ - else if (IPA_NAT_DEL_TYPE_HEAD == rule_pos) { - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL; - cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_PROTO_FIELD_VALUE; - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, - cur_tbl_entry); - cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_PROTO_FIELD_OFFSET; - - IPADBG("writing invalid proto: 0x%x\n", cmd->dma[no_of_cmds].data); - } - - /* - Update the previous entry of next_index field value - with current entry next_index field value - */ - else if (IPA_NAT_DEL_TYPE_MIDDLE == rule_pos) { - prev_entry = - Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params, - SW_SPEC_PARAM_PREV_INDEX_FIELD); - - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].data = - Read16BitFieldValue(tbl_ptr[cur_tbl_entry].nxt_indx_pub_port, - NEXT_INDEX_FIELD); - - cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL; - if (prev_entry >= cache_ptr->table_entries) { - cmd->dma[no_of_cmds].base_addr = IPA_NAT_EXPN_TBL; - prev_entry -= cache_ptr->table_entries; - } - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, prev_entry); - - cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_NEXT_FIELD_OFFSET; - } - - /* - Reset the previous entry of next_index field with 0 - */ - else if (IPA_NAT_DEL_TYPE_LAST == rule_pos) { - prev_entry = - Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params, - SW_SPEC_PARAM_PREV_INDEX_FIELD); - - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_NAT_ENTRY; - - cmd->dma[no_of_cmds].base_addr = IPA_NAT_BASE_TBL; - if (prev_entry >= cache_ptr->table_entries) { - cmd->dma[no_of_cmds].base_addr = IPA_NAT_EXPN_TBL; - prev_entry -= cache_ptr->table_entries; - } - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, prev_entry); - - cmd->dma[no_of_cmds].offset += IPA_NAT_RULE_NEXT_FIELD_OFFSET; - } - - /* ================================================ - Base Table rule Deletion End - ================================================*/ - - /* ================================================ - Index Table rule Deletion - ================================================*/ - ipa_nati_find_index_rule_pos(cache_ptr, - indx_tbl_entry, - &indx_rule_pos); - IPADBG("Index table entry: 0x%x\n", indx_tbl_entry); - IPADBG("and position: %d\n", indx_rule_pos); - if (indx_tbl_entry >= cache_ptr->table_entries) { - indx_tbl_entry -= cache_ptr->table_entries; - indx_tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr; - } else { - indx_tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr; - } - - /* Just delete the current rule by resetting nat_table_index field to 0 */ - if (IPA_NAT_DEL_TYPE_ONLY_ONE == indx_rule_pos) { - no_of_cmds++; - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL; - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_NAT_ENTRY; - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_index_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, - indx_tbl_entry); - - cmd->dma[no_of_cmds].offset += - IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET; - } - - /* copy the next entry values to current entry */ - else if (IPA_NAT_DEL_TYPE_HEAD == indx_rule_pos) { - next_entry = - Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - next_entry -= cache_ptr->table_entries; - - no_of_cmds++; - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL; - cmd->dma[no_of_cmds].table_index = tbl_indx; - - /* Copy the nat_table_index field value of next entry */ - indx_tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr; - cmd->dma[no_of_cmds].data = - Read16BitFieldValue(indx_tbl_ptr[next_entry].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD); - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_index_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, - indx_tbl_entry); - - cmd->dma[no_of_cmds].offset += - IPA_NAT_INDEX_RULE_NAT_INDEX_FIELD_OFFSET; - - /* Copy the next_index field value of next entry */ - no_of_cmds++; - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL; - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].data = - Read16BitFieldValue(indx_tbl_ptr[next_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_index_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, indx_tbl_entry); - - cmd->dma[no_of_cmds].offset += - IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET; - indx_next_entry = next_entry; - } - - /* - Update the previous entry of next_index field value - with current entry next_index field value - */ - else if (IPA_NAT_DEL_TYPE_MIDDLE == indx_rule_pos) { - prev_entry = cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index; - - no_of_cmds++; - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].data = - Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL; - if (prev_entry >= cache_ptr->table_entries) { - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDEX_EXPN_TBL; - prev_entry -= cache_ptr->table_entries; - } - - IPADBG("prev_entry: %d update with cur next_index: %d\n", - prev_entry, cmd->dma[no_of_cmds].data); - IPADBG("prev_entry: %d exist in table_type:%d\n", - prev_entry, cmd->dma[no_of_cmds].base_addr); - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_index_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, prev_entry); - - cmd->dma[no_of_cmds].offset += - IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET; - } - - /* Reset the previous entry next_index field with 0 */ - else if (IPA_NAT_DEL_TYPE_LAST == indx_rule_pos) { - prev_entry = cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index; - - no_of_cmds++; - cmd->dma[no_of_cmds].table_index = tbl_indx; - cmd->dma[no_of_cmds].data = IPA_NAT_INVALID_NAT_ENTRY; - - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDX_TBL; - if (prev_entry >= cache_ptr->table_entries) { - cmd->dma[no_of_cmds].base_addr = IPA_NAT_INDEX_EXPN_TBL; - prev_entry -= cache_ptr->table_entries; - } - - IPADBG("Reseting prev_entry: %d next_index\n", prev_entry); - IPADBG("prev_entry: %d exist in table_type:%d\n", - prev_entry, cmd->dma[no_of_cmds].base_addr); - - cmd->dma[no_of_cmds].offset = - ipa_nati_get_index_entry_offset(cache_ptr, - cmd->dma[no_of_cmds].base_addr, prev_entry); - - cmd->dma[no_of_cmds].offset += - IPA_NAT_INDEX_RULE_NEXT_FIELD_OFFSET; - } - - /* ================================================ - Index Table rule Deletion End - ================================================*/ - cmd->entries = no_of_cmds + 1; - - if (cmd->entries > 1) { - ReorderCmds(cmd, size); - } - if (ioctl(ipv4_nat_cache.ipa_fd, IPA_IOC_NAT_DMA, cmd)) { - perror("ipa_nati_post_del_dma_cmd(): ioctl error value"); - IPAERR("unable to post cmd\n"); - IPADBG("ipa fd %d\n", ipv4_nat_cache.ipa_fd); - ret = -EIO; - goto fail; - } - - /* if entry exist in IPA_NAT_DEL_TYPE_MIDDLE of list - Update the previous entry in sw specific parameters - */ - if (IPA_NAT_DEL_TYPE_MIDDLE == rule_pos) { - /* Retrieve the current entry prev_entry value */ - prev_entry = - Read16BitFieldValue(tbl_ptr[cur_tbl_entry].sw_spec_params, - SW_SPEC_PARAM_PREV_INDEX_FIELD); - - /* Retrieve the next entry */ - next_entry = - Read16BitFieldValue(tbl_ptr[cur_tbl_entry].nxt_indx_pub_port, - NEXT_INDEX_FIELD); - - next_entry -= cache_ptr->table_entries; - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr; - - /* copy the current entry prev_entry value to next entry*/ - UpdateSwSpecParams(&tbl_ptr[next_entry], - IPA_NAT_SW_PARAM_PREV_INDX_BYTE, - prev_entry); - } - - /* Reset the other field values of current delete entry - In case of IPA_NAT_DEL_TYPE_HEAD, don't reset */ - if (IPA_NAT_DEL_TYPE_HEAD != rule_pos) { - memset(&tbl_ptr[cur_tbl_entry], 0, sizeof(struct ipa_nat_rule)); - } - - if (indx_rule_pos == IPA_NAT_DEL_TYPE_HEAD) { - - /* Update next next entry previous value to current - entry as we moved the next entry values - to current entry */ - indx_next_next_entry = - Read16BitFieldValue(indx_tbl_ptr[indx_next_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - if (indx_next_next_entry != 0 && - indx_next_next_entry >= cache_ptr->table_entries) { - - IPADBG("Next Next entry: %d\n", indx_next_next_entry); - indx_next_next_entry -= cache_ptr->table_entries; - - IPADBG("Updating entry: %d prev index to: %d\n", - indx_next_next_entry, indx_tbl_entry); - cache_ptr->index_expn_table_meta[indx_next_next_entry].prev_index = - indx_tbl_entry; - } - - /* Now reset the next entry as we copied - the next entry to current entry */ - IPADBG("Resetting, index table entry(Proper): %d\n", - (cache_ptr->table_entries + indx_next_entry)); - - /* This resets both table entry and next index values */ - indx_tbl_ptr[indx_next_entry].tbl_entry_nxt_indx = 0; - - /* - In case of IPA_NAT_DEL_TYPE_HEAD, update the sw specific parameters - (index table entry) of base table entry - */ - indx_tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr; - table_entry = - Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD); - - if (table_entry >= cache_ptr->table_entries) { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr; - table_entry -= cache_ptr->table_entries; - } else { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr; - } - - UpdateSwSpecParams(&tbl_ptr[table_entry], - IPA_NAT_SW_PARAM_INDX_TBL_ENTRY_BYTE, - indx_tbl_entry); - } else { - /* Update the prev_entry value (in index_expn_table_meta) - for the next_entry in list with current entry prev_entry value - */ - if (IPA_NAT_DEL_TYPE_MIDDLE == indx_rule_pos) { - next_entry = - Read16BitFieldValue(indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - - if (next_entry >= cache_ptr->table_entries) { - next_entry -= cache_ptr->table_entries; - } - - cache_ptr->index_expn_table_meta[next_entry].prev_index = - cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index; - - cache_ptr->index_expn_table_meta[indx_tbl_entry].prev_index = - IPA_NAT_INVALID_NAT_ENTRY; - } - - IPADBG("At, indx_tbl_entry value: %d\n", indx_tbl_entry); - IPADBG("At, indx_tbl_entry member address: %p\n", - &indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx); - - indx_tbl_ptr[indx_tbl_entry].tbl_entry_nxt_indx = 0; - - } - -fail: - free(cmd); - - return ret; -} - -void ipa_nati_find_index_rule_pos( - struct ipa_nat_ip4_table_cache *cache_ptr, - uint16_t tbl_entry, - del_type *rule_pos) -{ - struct ipa_nat_indx_tbl_rule *tbl_ptr; - - if (tbl_entry >= cache_ptr->table_entries) { - tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_expn_addr; - - tbl_entry -= cache_ptr->table_entries; - if (Read16BitFieldValue(tbl_ptr[tbl_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED) == IPA_NAT_INVALID_NAT_ENTRY) { - *rule_pos = IPA_NAT_DEL_TYPE_LAST; - } else { - *rule_pos = IPA_NAT_DEL_TYPE_MIDDLE; - } - } else { - tbl_ptr = - (struct ipa_nat_indx_tbl_rule *)cache_ptr->index_table_addr; - - if (Read16BitFieldValue(tbl_ptr[tbl_entry].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED) == IPA_NAT_INVALID_NAT_ENTRY) { - *rule_pos = IPA_NAT_DEL_TYPE_ONLY_ONE; - } else { - *rule_pos = IPA_NAT_DEL_TYPE_HEAD; - } - } -} - -void ipa_nati_find_rule_pos(struct ipa_nat_ip4_table_cache *cache_ptr, - uint8_t expn_tbl, - uint16_t tbl_entry, - del_type *rule_pos) -{ - struct ipa_nat_rule *tbl_ptr; - - if (expn_tbl) { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_expn_rules_addr; - if (Read16BitFieldValue(tbl_ptr[tbl_entry].nxt_indx_pub_port, - NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) { - *rule_pos = IPA_NAT_DEL_TYPE_LAST; - } else { - *rule_pos = IPA_NAT_DEL_TYPE_MIDDLE; - } - } else { - tbl_ptr = (struct ipa_nat_rule *)cache_ptr->ipv4_rules_addr; - if (Read16BitFieldValue(tbl_ptr[tbl_entry].nxt_indx_pub_port, - NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) { - *rule_pos = IPA_NAT_DEL_TYPE_ONLY_ONE; - } else { - *rule_pos = IPA_NAT_DEL_TYPE_HEAD; - } - } -} - -void ipa_nati_del_dead_ipv4_head_nodes(uint8_t tbl_indx) -{ - struct ipa_nat_rule *tbl_ptr; - uint16_t cnt; - - tbl_ptr = - (struct ipa_nat_rule *)ipv4_nat_cache.ip4_tbl[tbl_indx].ipv4_rules_addr; - - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_indx].table_entries; - cnt++) { - - if (Read8BitFieldValue(tbl_ptr[cnt].ts_proto, - PROTOCOL_FIELD) == IPA_NAT_INVALID_PROTO_FIELD_CMP - && - Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port, - NEXT_INDEX_FIELD) == IPA_NAT_INVALID_NAT_ENTRY) { - /* Delete the IPA_NAT_DEL_TYPE_HEAD node */ - IPADBG("deleting the dead node 0x%x\n", cnt); - memset(&tbl_ptr[cnt], 0, sizeof(struct ipa_nat_rule)); - } - } /* end of for loop */ - - return; -} - - -/* ======================================================== - Debug functions - ========================================================*/ -#ifdef NAT_DUMP -void ipa_nat_dump_ipv4_table(uint32_t tbl_hdl) -{ - struct ipa_nat_rule *tbl_ptr; - struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; - int cnt; - uint8_t atl_one = 0; - - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - tbl_hdl > IPA_NAT_MAX_IP4_TBLS) { - IPAERR("invalid table handle passed\n"); - return; - } - - /* Print ipv4 rules */ - IPADBG("Dumping ipv4 active rules:\n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - atl_one = 1; - ipa_nati_print_rule(&tbl_ptr[cnt], cnt); - } - } - if (!atl_one) { - IPADBG("No active base rules, total: %d\n", - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries); - } - atl_one = 0; - - /* Print ipv4 expansion rules */ - IPADBG("Dumping ipv4 active expansion rules:\n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr; - for (cnt = 0; - cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - atl_one = 1; - ipa_nati_print_rule(&tbl_ptr[cnt], - (cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries)); - } - } - if (!atl_one) { - IPADBG("No active base expansion rules, total: %d\n", - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries); - } - atl_one = 0; - - /* Print ipv4 index rules */ - IPADBG("Dumping ipv4 index active rules:\n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - atl_one = 1; - ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt, 0); - } - } - if (!atl_one) { - IPADBG("No active index table rules, total:%d\n", - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries); - } - atl_one = 0; - - - /* Print ipv4 index expansion rules */ - IPADBG("Dumping ipv4 index expansion active rules:\n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr; - for (cnt = 0; - cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - atl_one = 1; - ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], - (cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries), - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_expn_table_meta[cnt].prev_index); - } - } - if (!atl_one) { - IPADBG("No active index expansion rules, total:%d\n", - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries); - } - atl_one = 0; - -} - -void ipa_nati_print_rule( - struct ipa_nat_rule *param, - uint32_t rule_id) -{ - struct ipa_nat_sw_rule sw_rule; - memcpy(&sw_rule, param, sizeof(sw_rule)); - uint32_t ip_addr; - - IPADUMP("rule-id:%d ", rule_id); - ip_addr = sw_rule.target_ip; - IPADUMP("Trgt-IP:%d.%d.%d.%d ", - ((ip_addr & 0xFF000000) >> 24), ((ip_addr & 0x00FF0000) >> 16), - ((ip_addr & 0x0000FF00) >> 8), ((ip_addr & 0x000000FF))); - - IPADUMP("Trgt-Port:%d Priv-Port:%d ", sw_rule.target_port, sw_rule.private_port); - - ip_addr = sw_rule.private_ip; - IPADUMP("Priv-IP:%d.%d.%d.%d ", - ((ip_addr & 0xFF000000) >> 24), ((ip_addr & 0x00FF0000) >> 16), - ((ip_addr & 0x0000FF00) >> 8), ((ip_addr & 0x000000FF))); - - IPADUMP("Pub-Port:%d Nxt-indx:%d ", sw_rule.public_port, sw_rule.next_index); - IPADUMP("IP-cksm-delta:0x%x En-bit:0x%x ", sw_rule.ip_chksum, sw_rule.enable); - IPADUMP("TS:0x%x Proto:0x%x ", sw_rule.time_stamp, sw_rule.protocol); - IPADUMP("Prv-indx:%d indx_tbl_entry:%d ", sw_rule.prev_index, sw_rule.indx_tbl_entry); - IPADUMP("Tcp-udp-cksum-delta:0x%x", sw_rule.tcp_udp_chksum); - IPADUMP("\n"); - return; -} - -void ipa_nati_print_index_rule( - struct ipa_nat_indx_tbl_rule *param, - uint32_t rule_id, uint16_t prev_indx) -{ - struct ipa_nat_sw_indx_tbl_rule sw_rule; - memcpy(&sw_rule, param, sizeof(sw_rule)); - - IPADUMP("rule-id:%d Table_entry:%d Next_index:%d, prev_indx:%d", - rule_id, sw_rule.tbl_entry, sw_rule.next_index, prev_indx); - IPADUMP("\n"); - return; -} - -int ipa_nati_query_nat_rules( - uint32_t tbl_hdl, - nat_table_type tbl_type) -{ - struct ipa_nat_rule *tbl_ptr; - struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; - int cnt = 0, ret = 0; - - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - tbl_hdl > IPA_NAT_MAX_IP4_TBLS) { - IPAERR("invalid table handle passed\n"); - return ret; - } - - /* Print ipv4 rules */ - if (tbl_type == IPA_NAT_BASE_TBL) { - IPADBG("Counting ipv4 active rules:\n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].ipv4_rules_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - ret++; - } - } - if (!ret) { - IPADBG("No active base rules\n"); - } - - IPADBG("Number of active base rules: %d\n", ret); - } - - /* Print ipv4 expansion rules */ - if (tbl_type == IPA_NAT_EXPN_TBL) { - IPADBG("Counting ipv4 active expansion rules:\n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].ipv4_expn_rules_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - ret++; - } - } - if (!ret) { - IPADBG("No active base expansion rules\n"); - } - - IPADBG("Number of active base expansion rules: %d\n", ret); - } - - /* Print ipv4 index rules */ - if (tbl_type == IPA_NAT_INDX_TBL) { - IPADBG("Counting ipv4 index active rules:\n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].index_table_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - ret++; - } - } - if (!ret) { - IPADBG("No active index table rules\n"); - } - - IPADBG("Number of active index table rules: %d\n", ret); - } - - /* Print ipv4 index expansion rules */ - if (tbl_type == IPA_NAT_INDEX_EXPN_TBL) { - IPADBG("Counting ipv4 index expansion active rules:\n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].index_table_expn_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - ret++; - } - } - - if (!ret) - IPADBG("No active index expansion rules\n"); - - IPADBG("Number of active index expansion rules: %d\n", ret); - } - - return ret; -} -#endif diff --git a/ipanat/src/ipa_nat_logi.c b/ipanat/src/ipa_nat_logi.c deleted file mode 100644 index b829b78..0000000 --- a/ipanat/src/ipa_nat_logi.c +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright (c) 2013, The Linux Foundation. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of The Linux Foundation nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED -WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -/*! - @file - IPACM_log.cpp - - @brief - This file implements the IPAM log functionality. - - @Author - Skylar Chang - -*/ -#include "ipa_nat_logi.h" -#include <stdlib.h> -#include <unistd.h> - -void log_nat_message(char *msg) -{ - return; -} - - diff --git a/ipanat/test/Android.mk b/ipanat/test/Android.mk deleted file mode 100644 index bb0c59b..0000000 --- a/ipanat/test/Android.mk +++ /dev/null @@ -1,55 +0,0 @@ -BOARD_PLATFORM_LIST := msm8916 -BOARD_PLATFORM_LIST += msm8909 -ifneq ($(call is-board-platform-in-list,$(BOARD_PLATFORM_LIST)),true) -ifneq (,$(filter $(QCOM_BOARD_PLATFORMS),$(TARGET_BOARD_PLATFORM))) -ifneq (, $(filter aarch64 arm arm64, $(TARGET_ARCH))) - -LOCAL_PATH := $(call my-dir) - -include $(CLEAR_VARS) - -LOCAL_C_INCLUDES := $(LOCAL_PATH)/ -LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../ipanat/inc - -ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true) -LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include -LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr -endif - -LOCAL_MODULE := ipa_nat_test -LOCAL_SRC_FILES := ipa_nat_test000.c \ - ipa_nat_test001.c \ - ipa_nat_test002.c \ - ipa_nat_test003.c \ - ipa_nat_test004.c \ - ipa_nat_test005.c \ - ipa_nat_test006.c \ - ipa_nat_test007.c \ - ipa_nat_test008.c \ - ipa_nat_test009.c \ - ipa_nat_test010.c \ - ipa_nat_test011.c \ - ipa_nat_test012.c \ - ipa_nat_test013.c \ - ipa_nat_test014.c \ - ipa_nat_test015.c \ - ipa_nat_test016.c \ - ipa_nat_test017.c \ - ipa_nat_test018.c \ - ipa_nat_test019.c \ - ipa_nat_test020.c \ - ipa_nat_test021.c \ - ipa_nat_test022.c \ - main.c - - -LOCAL_SHARED_LIBRARIES := libipanat - -LOCAL_MODULE_TAGS := debug -LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)/kernel-tests/ip_accelerator - -include $(BUILD_EXECUTABLE) - -endif # $(TARGET_ARCH) -endif -endif diff --git a/ipanat/test/Makefile.am b/ipanat/test/Makefile.am deleted file mode 100644 index 3aec070..0000000 --- a/ipanat/test/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -AM_CPPFLAGS = -I./../inc \ - -I$(top_srcdir)/ipanat/inc - -AM_CPPFLAGS += -Wall -Wundef -Wno-trigraphs -AM_CPPFLAGS += -g - -ipanattest_SOURCES = ipa_nat_test000.c \ - ipa_nat_test001.c \ - ipa_nat_test002.c \ - ipa_nat_test003.c \ - ipa_nat_test004.c \ - ipa_nat_test005.c \ - ipa_nat_test006.c \ - ipa_nat_test007.c \ - ipa_nat_test008.c \ - ipa_nat_test009.c \ - ipa_nat_test010.c \ - ipa_nat_test011.c \ - ipa_nat_test012.c \ - ipa_nat_test013.c \ - ipa_nat_test014.c \ - ipa_nat_test015.c \ - ipa_nat_test016.c \ - ipa_nat_test017.c \ - ipa_nat_test018.c \ - ipa_nat_test019.c \ - ipa_nat_test020.c \ - ipa_nat_test021.c \ - ipa_nat_test022.c \ - main.c - - -bin_PROGRAMS = ipanattest - -requiredlibs = ../src/libipanat.la - -ipanattest_LDADD = $(requiredlibs) - -LOCAL_MODULE := libipanat -LOCAL_PRELINK_MODULE := false -include $(BUILD_SHARED_LIBRARY) - diff --git a/ipanat/test/README.txt b/ipanat/test/README.txt deleted file mode 100644 index 4e87121..0000000 --- a/ipanat/test/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -1 To run this suite separately(each test case creates table and delete table) use below command - - To execute test suite nt times with n entries, command "ipanatest sep nt n" - - Example: To execute test suite 1 time with 100 entries, command "ipanattest sep 100" - - -2. To run test suite not separately(creates table and delete table only once) use below command - - To execute test suite nt times with n entries, command "ipanatest reg nt n" - - Example: To execute test suite 5 times with 32 entries, command "ipanattest reg 5 32" - - -3. To run inotify regression test use command, "ipanattest inotify nt" - - Example: To execute inotify 5 times, command "ipanattest inotify 5" - - -4. if we just give command "ipanattest", runs test suite 1 time with 100 entries (non separate) diff --git a/ipanat/test/ipa_nat_test.h b/ipanat/test/ipa_nat_test.h deleted file mode 100644 index d5ac0d5..0000000 --- a/ipanat/test/ipa_nat_test.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================== - - INCLUDE FILES FOR MODULE - -===========================================================================*/ -#include "stdint.h" /* uint32_t */ -#include "stdio.h" -#include <netinet/in.h> /* for proto definitions */ - -#define u32 uint32_t -#define u16 uint16_t -#define u8 uint8_t - -/*============ Preconditions to run NAT Test cases =========*/ -#define IPA_NAT_TEST_PRE_COND_TE 20 - -#define CHECK_ERR1(x, tbl_hdl) \ - if(ipa_nat_validate_ipv4_table(tbl_hdl)) { \ - if(sep) {\ - ipa_nat_del_ipv4_tbl(tbl_hdl); \ - }\ - return -1;\ - }\ - if(x) { \ - IPAERR("%d\n", ret); \ - if(sep) {\ - ipa_nat_del_ipv4_tbl(tbl_hdl); \ - }\ - return -1; \ - } - -#define CHECK_ERR(x) if(x) { \ - IPAERR("%d\n", ret); \ - return -1;\ - } - -#if 0 -#define CHECK_ERR(x) if(x) { \ - IPAERR("%d\n", ret); \ - if(sep) {\ - ipa_nat_del_ipv4_tbl(tbl_hdl); \ - }\ - return -1;\ - } -#endif - -#define IPADBG(fmt, args...) printf(" %s:%d " fmt, __FUNCTION__, __LINE__, ## args) -#define IPAERR(fmt, args...) printf(" %s:%d " fmt, __FUNCTION__, __LINE__, ## args) - -#define NAT_DUMP -int ipa_nat_validate_ipv4_table(u32); - -int ipa_nat_test000(int, u32, u8); -int ipa_nat_test001(int, u32, u8); -int ipa_nat_test002(int, u32, u8); -int ipa_nat_test003(int, u32, u8); -int ipa_nat_test004(int, u32, u8); -int ipa_nat_test005(int, u32, u8); -int ipa_nat_test006(int, u32, u8); -int ipa_nat_test007(int, u32, u8); -int ipa_nat_test008(int, u32, u8); -int ipa_nat_test009(int, u32, u8); -int ipa_nat_test010(int, u32, u8); -int ipa_nat_test011(int, u32, u8); -int ipa_nat_test012(int, u32, u8); -int ipa_nat_test013(int, u32, u8); -int ipa_nat_test014(int, u32, u8); -int ipa_nat_test015(int, u32, u8); -int ipa_nat_test016(int, u32, u8); -int ipa_nat_test017(int, u32, u8); -int ipa_nat_test018(int, u32, u8); -int ipa_nat_test019(int, u32, u8); -int ipa_nat_test020(int, u32, u8); -int ipa_nat_test021(int, int); -int ipa_nat_test022(int, u32, u8); diff --git a/ipanat/test/ipa_nat_test000.c b/ipanat/test/ipa_nat_test000.c deleted file mode 100644 index 09914ea..0000000 --- a/ipanat/test/ipa_nat_test000.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test000.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Delete ipv4 table -*/ -/*===========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test000(int total_entries, u32 tbl_hdl, u8 sep) -{ - - int ret; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - if (0 != ret) - { - IPAERR("unable to create ipv4 nat table and returning Error:%d\n", ret); - return -1; - } - IPADBG("create nat ipv4 table successfully() \n"); - - IPADBG("calling ipa_nat_del_ipv4_tbl() \n"); - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - if (0 != ret) - { - IPAERR("Unable to delete ipv4 nat table %d\n", ret); - return -1; - } - IPADBG("deleted ipv4 nat table successfully. Test passed \n"); - - return 0; -} diff --git a/ipanat/test/ipa_nat_test001.c b/ipanat/test/ipa_nat_test001.c deleted file mode 100644 index 8daef33..0000000 --- a/ipanat/test/ipa_nat_test001.c +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test001.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Add ipv4 rule - 3. Delete ipv4 table -*/ -/*===========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test001(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s()\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test002.c b/ipanat/test/ipa_nat_test002.c deleted file mode 100644 index e6f5ae3..0000000 --- a/ipanat/test/ipa_nat_test002.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test002.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Add ipv4 rule - 3. delete ipv4 rule - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test002(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s()\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test003.c b/ipanat/test/ipa_nat_test003.c deleted file mode 100644 index 0634265..0000000 --- a/ipanat/test/ipa_nat_test003.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - IPA_NAT_ipa_nat_test003.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Add ipv4 rule - 3. Add ipv4 rule - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test003(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1; - ipa_nat_ipv4_rule ipv4_rule; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test004.c b/ipanat/test/ipa_nat_test004.c deleted file mode 100644 index 02378ff..0000000 --- a/ipanat/test/ipa_nat_test004.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test004.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Query nat table handle - 3. Delete ipv4 table -*/ -/*===========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test004(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret = 0; - u32 tbl_hdl1 = 0; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_tbl(tbl_hdl1); - if(ret == 0) - { - IPAERR("able to delete table using invalid table handle\n"); - return -1; - } - } - return 0; -} diff --git a/ipanat/test/ipa_nat_test005.c b/ipanat/test/ipa_nat_test005.c deleted file mode 100644 index 12228d1..0000000 --- a/ipanat/test/ipa_nat_test005.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test005.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Add ipv4 rule - 3. Delete ipv4 rule - 4. Add ipv4 rule - 5. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test005(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret = 0; - u32 rule_hdl, rule_hdl1; - ipa_nat_ipv4_rule ipv4_rule; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - if (sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test006.c b/ipanat/test/ipa_nat_test006.c deleted file mode 100644 index 36f0171..0000000 --- a/ipanat/test/ipa_nat_test006.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test006.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same ipv rules - 3. delete first followed by second - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test006(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret=0; - u32 rule_hdl, rule_hdl1; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test007.c b/ipanat/test/ipa_nat_test007.c deleted file mode 100644 index 4160c02..0000000 --- a/ipanat/test/ipa_nat_test007.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test007.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same ipv rules - 3. delete second followed by first - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test007(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - return 0; -} diff --git a/ipanat/test/ipa_nat_test008.c b/ipanat/test/ipa_nat_test008.c deleted file mode 100644 index d016055..0000000 --- a/ipanat/test/ipa_nat_test008.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test008.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add 2 distinct rules - 3. delete first followed by second - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test008(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - ipv4_rule1.target_ip = 0xC1171602; /* 193.23.22.2 */ - ipv4_rule1.target_port = 1234; - ipv4_rule1.private_ip = 0xC2171602; /* 194.23.22.2 */ - ipv4_rule1.private_port = 5678; - ipv4_rule1.protocol = IPPROTO_TCP; - ipv4_rule1.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - return 0; -} diff --git a/ipanat/test/ipa_nat_test009.c b/ipanat/test/ipa_nat_test009.c deleted file mode 100644 index cf3c40f..0000000 --- a/ipanat/test/ipa_nat_test009.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test009.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add 2 distinct rules - 3. delete second followed by first - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test009(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - ipv4_rule1.target_ip = 0xC1171602; /* 193.23.22.2 */ - ipv4_rule1.target_port = 1234; - ipv4_rule1.private_ip = 0xC2171602; /* 194.23.22.2 */ - ipv4_rule1.private_port = 5678; - ipv4_rule1.protocol = IPPROTO_TCP; - ipv4_rule1.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test010.c b/ipanat/test/ipa_nat_test010.c deleted file mode 100644 index 42d7fee..0000000 --- a/ipanat/test/ipa_nat_test010.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test010.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add 3 distinct ipv4 rules - 3. delete first, second followed by last - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test010(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1, rule_hdl2; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - ipv4_rule1.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule1.target_port = 1235; - ipv4_rule1.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule1.private_port = 5679; - ipv4_rule1.protocol = IPPROTO_TCP; - ipv4_rule1.public_port = 9051; - - ipv4_rule2.target_ip = 0xC1171602; /* 193.23.22.2 */ - ipv4_rule2.target_port = 1235; - ipv4_rule2.private_ip = 0xC2171602; /* 194.23.22.2 */ - ipv4_rule2.private_port = 5679; - ipv4_rule2.protocol = IPPROTO_TCP; - ipv4_rule2.public_port = 9051; - - IPADBG("%s():\n",__FUNCTION__); - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test011.c b/ipanat/test/ipa_nat_test011.c deleted file mode 100644 index bcce76c..0000000 --- a/ipanat/test/ipa_nat_test011.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test011.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add 3 distinct ipv4 rules - 3. delete second, first followed by last - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test011(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1, rule_hdl2; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - ipv4_rule1.target_ip = 0xF1181601; - ipv4_rule1.target_port = 1555; - ipv4_rule1.private_ip = 0xF2151601; - ipv4_rule1.private_port = 5999; - ipv4_rule1.protocol = IPPROTO_TCP; - ipv4_rule1.public_port = 9111; - - ipv4_rule2.target_ip = 0xC1166602; - ipv4_rule2.target_port = 1555; - ipv4_rule2.private_ip = 0xC2155602; - ipv4_rule2.private_port = 5777; - ipv4_rule2.protocol = IPPROTO_TCP; - ipv4_rule2.public_port = 9000; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test012.c b/ipanat/test/ipa_nat_test012.c deleted file mode 100644 index 9d3c835..0000000 --- a/ipanat/test/ipa_nat_test012.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test012.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add 3 distinct ipv4 rules - 3. Delete third, second, first - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - - -int ipa_nat_test012(int totoal_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1, rule_hdl2; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - ipv4_rule1.target_ip = 0xD1171601; - ipv4_rule1.target_port = 3512; - ipv4_rule1.private_ip = 0xD2471601; - ipv4_rule1.private_port = 9997; - ipv4_rule1.protocol = IPPROTO_TCP; - ipv4_rule1.public_port = 8881; - - ipv4_rule2.target_ip = 0xC1172452; - ipv4_rule2.target_port = 1895; - ipv4_rule2.private_ip = 0xC2172452; - ipv4_rule2.private_port = 6668; - ipv4_rule2.protocol = IPPROTO_TCP; - ipv4_rule2.public_port = 5551; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, totoal_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test013.c b/ipanat/test/ipa_nat_test013.c deleted file mode 100644 index 2b9b005..0000000 --- a/ipanat/test/ipa_nat_test013.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test013.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add 3 distinct ipv4 rules - 3. Delete third, first and second - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test013(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl, rule_hdl1, rule_hdl2; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule1, ipv4_rule2; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - ipv4_rule1.target_ip = 0xC1171609; /* 193.23.22.9 */ - ipv4_rule1.target_port = 1235; - ipv4_rule1.private_ip = 0xC2171609; /* 194.23.22.9 */ - ipv4_rule1.private_port = 6579; - ipv4_rule1.protocol = IPPROTO_TCP; - ipv4_rule1.public_port = 8951; - - ipv4_rule2.target_ip = 0xC1171606; /* 193.23.22.6 */ - ipv4_rule2.target_port = 1235; - ipv4_rule2.private_ip = 0xC2171606; /* 194.23.22.6 */ - ipv4_rule2.private_port = 7956; - ipv4_rule2.protocol = IPPROTO_TCP; - ipv4_rule2.public_port = 5109; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule1, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test014.c b/ipanat/test/ipa_nat_test014.c deleted file mode 100644 index fd30317..0000000 --- a/ipanat/test/ipa_nat_test014.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test014.cpp - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete first, second and third - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test014(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s()\n", __FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test015.c b/ipanat/test/ipa_nat_test015.c deleted file mode 100644 index eaef923..0000000 --- a/ipanat/test/ipa_nat_test015.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test015.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete first, third and second - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - - -int ipa_nat_test015(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test016.c b/ipanat/test/ipa_nat_test016.c deleted file mode 100644 index 23157e2..0000000 --- a/ipanat/test/ipa_nat_test016.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test016.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete second, first and third - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test016(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test017.c b/ipanat/test/ipa_nat_test017.c deleted file mode 100644 index d88e611..0000000 --- a/ipanat/test/ipa_nat_test017.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test017.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete second, third and first - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test017(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test018.c b/ipanat/test/ipa_nat_test018.c deleted file mode 100644 index c885d4d..0000000 --- a/ipanat/test/ipa_nat_test018.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test018.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete third, second and first - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test018(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test019.c b/ipanat/test/ipa_nat_test019.c deleted file mode 100644 index 3ba3119..0000000 --- a/ipanat/test/ipa_nat_test019.c +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test019.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete third, first and second - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test019(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test020.c b/ipanat/test/ipa_nat_test020.c deleted file mode 100644 index e6871b5..0000000 --- a/ipanat/test/ipa_nat_test020.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test020.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 4 ipv rules - 3. delete third, second, fourth and first - 4. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test020(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3, rule_hdl4; - ipa_nat_ipv4_rule ipv4_rule; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl4); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl2); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl4); - CHECK_ERR(ret); - - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR(ret); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - - return 0; -} diff --git a/ipanat/test/ipa_nat_test021.c b/ipanat/test/ipa_nat_test021.c deleted file mode 100644 index 48c4321..0000000 --- a/ipanat/test/ipa_nat_test021.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/*=========================================================================*/ -/*! - @file - ipa_nat_test021.c - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test021(int total_entries, int reg) -{ - - int ret, i; - u32 tbl_hdl; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - IPADBG("%s():\n",__FUNCTION__); - - for(i=0; i<reg; i++) - { - IPADBG("executing %d th time:\n",i); - - IPADBG("calling ipa_nat_add_ipv4_tbl() \n"); - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - if (0 != ret) - { - IPAERR("unable to create ipv4 nat table and returning Error:%d\n", ret); - IPADBG("executed %d times:\n",i); - return -1; - } - IPADBG("create nat ipv4 table successfully() \n"); - - IPADBG("calling ipa_nat_del_ipv4_tbl() \n"); - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - if (0 != ret) - { - IPAERR("Unable to delete ipv4 nat table %d\n", ret); - IPADBG("executed %d times:\n",i); - return -1; - } - IPADBG("deleted ipv4 nat table successfully. Test passed \n"); - } - - IPADBG("executed %d times:\n",(i+1)); - return 0; -} diff --git a/ipanat/test/ipa_nat_test022.c b/ipanat/test/ipa_nat_test022.c deleted file mode 100644 index ebdd291..0000000 --- a/ipanat/test/ipa_nat_test022.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -/*=========================================================================*/ -/*! - @file - ipa_nat_test022.cpp - - @brief - Verify the following scenario: - 1. Add ipv4 table - 2. add same 3 ipv rules - 3. delete Head and last entry - 4. add 2 new same ip4 entries - 5. Add head entry again - 6. Delete ipv4 table -*/ -/*=========================================================================*/ - -#include "ipa_nat_test.h" -#include "ipa_nat_drv.h" - -int ipa_nat_test022(int total_entries, u32 tbl_hdl, u8 sep) -{ - int ret; - u32 rule_hdl1, rule_hdl2, rule_hdl3; - ipa_nat_ipv4_rule ipv4_rule, ipv4_rule2; - u32 rule_hdl21, rule_hdl22; - - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - /* Rule 1 */ - ipv4_rule.target_ip = 0xC1171601; /* 193.23.22.1 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171601; /* 194.23.22.1 */ - ipv4_rule.private_port = 5678; - ipv4_rule.protocol = IPPROTO_TCP; - ipv4_rule.public_port = 9050; - - /* Rule 2*/ - ipv4_rule.target_ip = 0xC1171604; /* 193.23.22.4 */ - ipv4_rule.target_port = 1234; - ipv4_rule.private_ip = 0xC2171603; /* 194.23.22.3 */ - ipv4_rule.private_port = 5680; - ipv4_rule.protocol = IPPROTO_UDP; - ipv4_rule.public_port = 9066; - - IPADBG("%s():\n",__FUNCTION__); - - if(sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR1(ret, tbl_hdl); - } - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl1); - CHECK_ERR1(ret, tbl_hdl); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl2); - CHECK_ERR1(ret, tbl_hdl); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR1(ret, tbl_hdl); - - /* Delete head entry */ - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl1); - CHECK_ERR1(ret, tbl_hdl); - - /* Delete Last Entry */ - ret = ipa_nat_del_ipv4_rule(tbl_hdl, rule_hdl3); - CHECK_ERR1(ret, tbl_hdl); - - /* Add 2 different Entries */ - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl21); - CHECK_ERR1(ret, tbl_hdl); - - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule2, &rule_hdl22); - CHECK_ERR1(ret, tbl_hdl); - - /* Add first entry again */ - ret = ipa_nat_add_ipv4_rule(tbl_hdl, &ipv4_rule, &rule_hdl3); - CHECK_ERR1(ret, tbl_hdl); - - if(sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR1(ret, tbl_hdl); - } - - return 0; -} diff --git a/ipanat/test/main.c b/ipanat/test/main.c deleted file mode 100644 index c49ce3b..0000000 --- a/ipanat/test/main.c +++ /dev/null @@ -1,640 +0,0 @@ -/* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following - * disclaimer in the documentation and/or other materials provided - * with the distribution. - * * Neither the name of The Linux Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR - * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN - * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#include <sys/stat.h> -#include <fcntl.h> - -#include "ipa_nat_drv.h" -#include "ipa_nat_drvi.h" -#include "ipa_nat_test.h" - -extern struct ipa_nat_cache ipv4_nat_cache; - -int chk_for_loop(u32 tbl_hdl) -{ - struct ipa_nat_rule *tbl_ptr; - struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; - int cnt; - uint16_t cur_entry; - - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - tbl_hdl > IPA_NAT_MAX_IP4_TBLS) { - IPAERR("invalid table handle passed \n"); - return -EINVAL; - } - - IPADBG("checking ipv4 rules:\n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl,ENABLE_FIELD)) { - if(Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port, - NEXT_INDEX_FIELD) == cnt) - { - IPAERR("Infinite loop detected, entry\n"); - ipa_nati_print_rule(&tbl_ptr[cnt], cnt); - return -EINVAL; - } - } - } - - /* Print ipv4 expansion rules */ - IPADBG("checking ipv4 active expansion rules:\n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr; - for (cnt = 0; - cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - cur_entry = - cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - if (Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port, - NEXT_INDEX_FIELD) == cur_entry) - { - IPAERR("Infinite loop detected\n"); - ipa_nati_print_rule(&tbl_ptr[cnt], - (cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries)); - return -EINVAL; - } - } - } - - /* Print ipv4 index rules */ - IPADBG("checking ipv4 index active rules: \n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED) == cnt) - { - IPAERR("Infinite loop detected\n"); - ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], cnt, 0); - return -EINVAL; - } - } - } - - /* Print ipv4 index expansion rules */ - IPADBG("Checking ipv4 index expansion active rules: \n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr; - for (cnt = 0; - cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - cur_entry = - cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED) == cur_entry) - { - IPAERR("Infinite loop detected\n"); - ipa_nati_print_index_rule(&indx_tbl_ptr[cnt], - (cnt + ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries), - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].index_expn_table_meta[cnt].prev_index); - return -EINVAL; - } - } - } - return 0; -} - -uint8_t is_base_entry_valid(u32 tbl_hdl, u16 entry) -{ - struct ipa_nat_rule *tbl_ptr; - - if (entry > - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries) - { - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr; - entry -= - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - } - else - { - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr; - } - return (Read16BitFieldValue(tbl_ptr[entry].ip_cksm_enbl, - ENABLE_FIELD)); -} - -uint8_t is_index_entry_valid(u32 tbl_hdl, u16 entry) -{ - struct ipa_nat_indx_tbl_rule *tbl_ptr; - - if (entry > - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries) - { - tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr; - entry -= - ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - } - else - { - tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr; - } - if (Read16BitFieldValue(tbl_ptr[entry].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - return 1; - } - else - { - return 0; - } -} - -int chk_for_validity(u32 tbl_hdl) -{ - struct ipa_nat_rule *tbl_ptr; - struct ipa_nat_indx_tbl_rule *indx_tbl_ptr; - uint16_t nxt_index, prv_index; - int cnt; - - if (IPA_NAT_INVALID_NAT_ENTRY == tbl_hdl || - tbl_hdl > IPA_NAT_MAX_IP4_TBLS) { - IPAERR("invalid table handle passed \n"); - return -EINVAL; - } - - /* Validate base table next_indx and prev_indx values */ - IPADBG("Validating ipv4 active rules: \n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_rules_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - nxt_index = - Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port, - NEXT_INDEX_FIELD); - if (!is_base_entry_valid(tbl_hdl, nxt_index)) { - IPAERR("Invalid next index found, entry:%d\n", cnt); - } - } - } - - IPADBG("Validating ipv4 expansion active rules: \n"); - tbl_ptr = (struct ipa_nat_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].ipv4_expn_rules_addr; - for (cnt = 0; - cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(tbl_ptr[cnt].ip_cksm_enbl, - ENABLE_FIELD)) { - /* Validate next index */ - nxt_index = - Read16BitFieldValue(tbl_ptr[cnt].nxt_indx_pub_port, - NEXT_INDEX_FIELD); - if (!is_base_entry_valid(tbl_hdl, nxt_index)) { - IPAERR("Invalid next index found, entry:%d\n", cnt); - } - /* Validate previous index */ - prv_index = - Read16BitFieldValue(tbl_ptr[cnt].sw_spec_params, - SW_SPEC_PARAM_PREV_INDEX_FIELD); - if (!is_base_entry_valid(tbl_hdl, prv_index)) { - IPAERR("Invalid Previous index found, entry:%d\n", cnt); - } - } - } - - IPADBG("Validating ipv4 index active rules: \n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_addr; - for (cnt = 0; - cnt < ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - nxt_index = - Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - if (!is_index_entry_valid(tbl_hdl, nxt_index)) { - IPAERR("Invalid next index found, entry:%d\n", cnt); - } - } - } - - IPADBG("Validating ipv4 index expansion active rules: \n"); - indx_tbl_ptr = (struct ipa_nat_indx_tbl_rule *) - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_table_expn_addr; - for (cnt = 0; - cnt <= ipv4_nat_cache.ip4_tbl[tbl_hdl - 1].expn_table_entries; - cnt++) { - if (Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_TBL_ENTRY_FIELD)) { - /* Validate next index*/ - nxt_index = - Read16BitFieldValue(indx_tbl_ptr[cnt].tbl_entry_nxt_indx, - INDX_TBL_NEXT_INDEX_FILED); - if (!is_index_entry_valid(tbl_hdl, nxt_index)) { - IPAERR("Invalid next index found, entry:%d\n", cnt); - } - - /* Validate previous index*/ - prv_index = - ipv4_nat_cache.ip4_tbl[tbl_hdl-1].index_expn_table_meta[cnt].prev_index; - - if (!is_index_entry_valid(tbl_hdl, prv_index)) { - IPAERR("Invalid Previous index found, entry:%d\n", cnt); - } - } - } - - return 0; -} - -int ipa_nat_validate_ipv4_table(u32 tbl_hdl) -{ - int ret = 0; - - ret = chk_for_loop(tbl_hdl); - if (ret) - return ret; - ret = chk_for_validity(tbl_hdl); - - return ret; -} - -int main(int argc, char* argv[]) -{ - int exec = 0, pass = 0, ret; - int cnt, nt=1; - int total_entries = 100; - u8 sep = 0; - u32 tbl_hdl = 0; - u32 pub_ip_add = 0x011617c0; /* "192.23.22.1" */ - - IPADBG("ipa_nat_testing user space nat driver\n"); - - if (argc == 4) - { - if (!strncmp(argv[1], "reg", 3)) - { - nt = atoi(argv[2]); - total_entries = atoi(argv[3]); - IPADBG("Reg: %d, Nat Entries: %d\n", nt, total_entries); - } - else if (!strncmp(argv[1], "sep", 3)) - { - sep = 1; - nt = atoi(argv[2]); - total_entries = atoi(argv[3]); - } - } - else if (argc == 3) - { - if (!strncmp(argv[1], "inotify", 7)) - { - ipa_nat_test021(total_entries, atoi(argv[2])); - return 0; - } - else if (!strncmp(argv[1], "sep", 3)) - { - sep = 1; - total_entries = atoi(argv[2]); - } - } - else if (argc == 2) - { - total_entries = atoi(argv[1]); - IPADBG("Nat Entries: %d\n", total_entries); - } - - - for (cnt=0; cnt<nt; cnt++) - { - IPADBG("%s():Executing %d time \n",__FUNCTION__, cnt); - - if (!sep) - { - ret = ipa_nat_add_ipv4_tbl(pub_ip_add, total_entries, &tbl_hdl); - CHECK_ERR(ret); - } - - if (sep) - { - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test000(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test001(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - } - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test002(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - if (sep) - { - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test003(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test004(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test005(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - } - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test006(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test007(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test008(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test00%d\n", exec); - ret = ipa_nat_test009(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test00%d Fail\n", exec); - } - exec++; - - if (total_entries >= IPA_NAT_TEST_PRE_COND_TE) - { - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test010(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test011(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test012(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test013(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test014(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test015(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test016(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test017(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test018(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test019(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test020(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - - IPADBG("\n\nExecuting ipa_nat_test0%d\n", exec); - ret = ipa_nat_test022(total_entries, tbl_hdl, sep); - if (!ret) - { - pass++; - } - else - { - IPAERR("ipa_nat_test0%d Fail\n", exec); - } - exec++; - } - - if (!sep) - { - ret = ipa_nat_del_ipv4_tbl(tbl_hdl); - CHECK_ERR(ret); - } - } - /*======= Printing Results ==========*/ - IPADBG("Total ipa_nat Tests Run:%d, Pass:%d, Fail:%d\n",exec, pass, exec-pass); - return 0; -} |