aboutsummaryrefslogtreecommitdiff
path: root/data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h
diff options
context:
space:
mode:
Diffstat (limited to 'data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h')
-rw-r--r--data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h282
1 files changed, 282 insertions, 0 deletions
diff --git a/data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h b/data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h
new file mode 100644
index 0000000..e517e97
--- /dev/null
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h
@@ -0,0 +1,282 @@
+/*
+Copyright (c) 2014-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.
+*/
+
+/*
+ * 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 vlan_iface_info
+{
+ char vlan_iface_name[IPA_RESOURCE_NAME_MAX];
+ uint8_t vlan_id;
+ uint32_t vlan_iface_ipv6_addr[4];
+ uint8_t vlan_client_mac[6];
+ uint32_t vlan_client_ipv6_addr[4];
+};
+
+struct l2tp_vlan_mapping_info
+{
+ /* the following are l2tp iface info (name, session id) */
+ char l2tp_iface_name[IPA_RESOURCE_NAME_MAX];
+ uint8_t l2tp_session_id;
+ /* the following are mdm vlan iface info (name, vlan id, ipv6 addr) */
+ char vlan_iface_name[IPA_RESOURCE_NAME_MAX];
+ uint8_t vlan_id;
+ uint32_t vlan_iface_ipv6_addr[4];
+ /* the following are MIB3 vlan client info (mac, ipv6 addr) */
+ uint8_t vlan_client_mac[6];
+ uint32_t vlan_client_ipv6_addr[4];
+ /* the following is MIB3 l2tp client info (mac) */
+ uint8_t l2tp_client_mac[6];
+};
+
+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 l2tp_rt_rule_info
+{
+ uint32_t first_pass_hdr_hdl; /* first pass hdr template (IPv4 and IPv6 use the same hdr template) */
+ uint32_t first_pass_hdr_proc_ctx_hdl[IPA_IP_MAX]; /* first pass hdr proc ctx */
+ uint32_t second_pass_hdr_hdl; /* second pass hdr template (IPv4 and IPv6 use the same hdr template) */
+ int num_rt_hdl[IPA_IP_MAX]; /* number of TX properties for IPv4 and IPv6 respectively */
+ uint32_t first_pass_rt_rule_hdl[IPA_IP_MAX][MAX_NUM_PROP]; /* first pass routing rule */
+ uint32_t second_pass_rt_rule_hdl[MAX_NUM_PROP]; /*second pass routing rule (only ipv6 rt rule is needed) */
+};
+
+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 */
+ bool is_l2tp_client;
+ l2tp_vlan_mapping_info *mapping_info;
+ l2tp_rt_rule_info l2tp_rt_rule_hdl[IPA_HDR_L2_MAX];
+};
+
+struct flt_rule_info
+{
+ client_info *p_client;
+ uint32_t flt_rule_hdl[IPA_IP_MAX];
+ uint32_t l2tp_first_pass_flt_rule_hdl[IPA_IP_MAX]; /* L2TP filtering rules are destination MAC based */
+ uint32_t l2tp_second_pass_flt_rule_hdl;
+};
+
+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, bool is_l2tp_client, l2tp_vlan_mapping_info *mapping_info);
+
+ 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);
+#ifdef FEATURE_L2TP
+ void switch_to_l2tp_iface();
+
+ bool set_l2tp_iface(char *vlan_iface_name);
+
+ bool is_l2tp_iface();
+
+ void handle_l2tp_enable();
+
+ void handle_l2tp_disable();
+#endif
+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;
+ bool m_is_l2tp_iface;
+
+ 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;
+ uint32_t hdr_proc_ctx_for_l2tp; /* uc needs to remove 62 bytes IPv6 + L2TP + inner Ethernet header */
+
+ 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 add_l2tp_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:
+
+ static IPACM_LanToLan* p_instance;
+ static IPACM_LanToLan* get_instance();
+#ifdef FEATURE_L2TP
+ bool has_l2tp_iface();
+#endif
+
+private:
+
+ IPACM_LanToLan();
+
+ ~IPACM_LanToLan();
+
+ bool m_has_l2tp_iface;
+
+ list<class IPACM_LanToLan_Iface> m_iface;
+
+ list<ipacm_event_eth_bridge> m_cached_client_add_event;
+
+ list<vlan_iface_info> m_vlan_iface;
+
+ list<l2tp_vlan_mapping_info> m_l2tp_vlan_mapping;
+
+ 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);
+
+#ifdef FEATURE_L2TP
+ void handle_add_vlan_iface(ipa_ioc_vlan_iface_info *data);
+
+ void handle_del_vlan_iface(ipa_ioc_vlan_iface_info *data);
+
+ void handle_add_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info *data);
+
+ void handle_del_l2tp_vlan_mapping(ipa_ioc_l2tp_vlan_mapping_info *data);
+
+ void handle_vlan_client_info(ipacm_event_data_all *data);
+
+ void handle_vlan_iface_info(ipacm_event_data_all *data);
+#endif
+
+ 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