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.h175
1 files changed, 175 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..06d5832
--- /dev/null
+++ b/data-ipa-cfg-mgr/ipacm/inc/IPACM_LanToLan.h
@@ -0,0 +1,175 @@
+/*
+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"
+#include <unordered_map>
+
+#ifdef FEATURE_IPA_ANDROID
+#include <libxml/list.h>
+#else/* defined(FEATURE_IPA_ANDROID) */
+#include <list>
+#endif /* ndefined(FEATURE_IPA_ANDROID)*/
+
+struct client_info;
+
+struct peer_info
+{
+ struct client_info* peer_pointer;
+ int num_connection;
+};
+
+//used to store rule handles for offload link (one direction)
+struct offload_link_info
+{
+ struct client_info* peer_pointer;
+ uint32_t flt_rule_hdl;
+ lan_to_lan_rt_rule_hdl rt_rule_hdl;
+ uint32_t hdr_hdl;
+};
+
+typedef list<peer_info> peer_info_list;
+typedef list<offload_link_info> offload_link_info_list;
+typedef list<ipacm_event_connection> connection_list;
+
+struct client_info
+{
+ union
+ {
+ uint32_t ipv4_addr;
+ uint32_t ipv6_addr[4];
+ } ip;
+ uint8_t mac_addr[6];
+ bool is_active;
+ bool is_powersave;
+ IPACM_Lan* p_iface;
+ peer_info_list peer;
+ offload_link_info_list link;
+};
+
+struct v6_addr
+{
+ uint32_t ipv6_addr[4];
+};
+
+typedef unordered_map<uint32_t, client_info> client_table_v4;
+typedef unordered_map<uint64_t, client_info> client_table_v6;
+
+
+class IPACM_LanToLan : public IPACM_Listener
+{
+
+public:
+
+ IPACM_LanToLan();
+ ~IPACM_LanToLan();
+
+ void handle_new_connection(ipacm_event_connection* new_conn);
+ void handle_del_connection(ipacm_event_connection* del_conn);
+
+ static IPACM_LanToLan* getLan2LanInstance();
+
+private:
+
+ uint8_t num_offload_pair_v4_;
+ uint8_t num_offload_pair_v6_;
+ client_table_v4 client_info_v4_;
+ client_table_v6 client_info_v6_;
+
+ connection_list connection_v4_;
+ connection_list connection_v6_;
+
+ static IPACM_LanToLan* p_instance;
+
+ void event_callback(ipa_cm_event_id event, void* param);
+
+ void handle_client_active(ipacm_event_lan_client* data);
+
+ void check_potential_link(ipa_ip_type iptype, client_info* client);
+
+ int add_offload_link(ipa_ip_type iptype, client_info* client, client_info* peer);
+
+ void handle_client_inactive(ipacm_event_lan_client* data);
+
+ int turnoff_offload_links(ipa_ip_type iptype, client_info* client);
+
+ int del_offload_link(ipa_ip_type iptype, IPACM_Lan* client, IPACM_Lan* peer, offload_link_info* link);
+
+ void handle_client_disconnect(ipacm_event_lan_client* data);
+
+ int clear_peer_list(client_info* client);
+
+ void handle_client_power_save(ipacm_event_lan_client* data);
+
+ void handle_client_power_recover(ipacm_event_lan_client* data);
+
+ int remove_flt_rules(ipa_ip_type iptype, client_info* client);
+
+ int add_flt_rules(ipa_ip_type iptype, client_info* client);
+
+//the following are for connections
+
+ void handle_new_lan2lan_connection(ipacm_event_connection* data);
+
+ bool add_connection(client_info* src_client, client_info* dst_client);
+
+ void handle_del_lan2lan_connection(ipacm_event_connection* data);
+
+ bool remove_connection(client_info* src_client, client_info* dst_client);
+
+ void erase_offload_link(ipa_ip_type iptype, client_info* src_client, client_info* dst_client);
+
+ void generate_new_connection(ipa_ip_type iptype, client_info* client);
+
+ bool is_lan2lan_connection(ipacm_event_connection* data);
+
+ bool is_potential_lan2lan_connection(ipacm_event_connection* new_conn);
+
+ void cache_new_connection(ipacm_event_connection* new_conn);
+
+ void remove_cache_connection(ipacm_event_connection* del_conn);
+
+ void check_cache_connection(ipa_ip_type iptype, client_info* client);
+
+};
+
+#endif