IPACM: eMBMS traffic take offload path on ODU only
The eMBMS traffic in CPE mode will take SW-path instead
of IPA-HW because there might be embms traffic initiated
from wifi-client. Only in ODU mode, the eMBMS traffic
will take IPA-HW offload path to ODU-client.
Change-Id: I4a8744bb9fe4129891dd037e10eea105897418d6
diff --git a/ipacm/inc/IPACM_Config.h b/ipacm/inc/IPACM_Config.h
index 54e2d0c..69080ad 100644
--- a/ipacm/inc/IPACM_Config.h
+++ b/ipacm/inc/IPACM_Config.h
@@ -113,6 +113,8 @@
bool ipacm_odu_enable;
+ bool ipacm_odu_embms_enable;
+
int ipa_nat_iface_entries;
/* Max valid rm entry */
diff --git a/ipacm/inc/IPACM_Xml.h b/ipacm/inc/IPACM_Xml.h
index 90e0289..2b8d5d9 100644
--- a/ipacm/inc/IPACM_Xml.h
+++ b/ipacm/inc/IPACM_Xml.h
@@ -77,6 +77,7 @@
#define system_TAG "system"
#define ODU_TAG "ODUCFG"
#define ODUMODE_TAG "Mode"
+#define ODUEMBMS_OFFLOAD_TAG "eMBMS_offload"
#define ODU_ROUTER_TAG "router"
#define ODU_BRIDGE_TAG "bridge"
#define IPACMCFG_TAG "IPACM"
@@ -267,6 +268,7 @@
int nat_max_entries;
bool odu_enable;
bool router_mode_enable;
+ bool odu_embms_enable;
} IPACM_conf_t;
/* This function read IPACM XML configuration*/
diff --git a/ipacm/src/IPACM_Config.cpp b/ipacm/src/IPACM_Config.cpp
index 1a11012..efc06fb 100644
--- a/ipacm/src/IPACM_Config.cpp
+++ b/ipacm/src/IPACM_Config.cpp
@@ -209,8 +209,10 @@
/* 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);
/* Allocate more non-nat entries if the monitored iface dun have Tx/Rx properties */
if (pNatIfaces != NULL)
diff --git a/ipacm/src/IPACM_IfaceManager.cpp b/ipacm/src/IPACM_IfaceManager.cpp
index 573d7c6..d8998cb 100644
--- a/ipacm/src/IPACM_IfaceManager.cpp
+++ b/ipacm/src/IPACM_IfaceManager.cpp
@@ -157,21 +157,21 @@
case IPA_WAN_EMBMS_LINK_UP_EVENT:
ipa_interface_index = IPACM_Iface::iface_ipa_index_query(evt_data->if_index);
/* change iface category from unknown to EMBMS_IF */
- if (IPACM_Iface::ipacmcfg->ipacm_odu_enable == true)
+ 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);
- }
+ 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;
diff --git a/ipacm/src/IPACM_Lan.cpp b/ipacm/src/IPACM_Lan.cpp
index a5b5eae..8716645 100644
--- a/ipacm/src/IPACM_Lan.cpp
+++ b/ipacm/src/IPACM_Lan.cpp
@@ -573,9 +573,17 @@
/* 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);
- handle_odu_route_add(); /* construct ODU RT tbl*/
- IPACMDBG("construct ODU header and route rules \n");
+ if (IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable == true)
+ {
+ handle_odu_route_add();
+ IPACMDBG("construct ODU header and route rules, embms_flag (%d) \n", IPACM_Iface::ipacmcfg->ipacm_odu_embms_enable);
+ }
+ else
+ {
+ IPACMDBG("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)
@@ -2297,7 +2305,11 @@
if (IPACM_Iface::ipacmcfg->iface_table[ipa_if_num].if_cat == ODU_IF)
{
/* delete ODU default RT rules */
- handle_odu_route_del();
+ 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)
diff --git a/ipacm/src/IPACM_Xml.cpp b/ipacm/src/IPACM_Xml.cpp
index 6ef4cc0..cf048db 100644
--- a/ipacm/src/IPACM_Xml.cpp
+++ b/ipacm/src/IPACM_Xml.cpp
@@ -234,6 +234,28 @@
}
}
else if (IPACM_util_icmp_string((char*)xml_node->name,
+ ODUEMBMS_OFFLOAD_TAG) == 0)
+ {
+ IPACMDBG("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("router-mode enable %d buf(%d)\n", config->odu_embms_enable, atoi(content_buf));
+ }
+ else
+ {
+ config->odu_embms_enable = false;
+ IPACMDBG("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);
diff --git a/ipacm/src/IPACM_cfg.xml b/ipacm/src/IPACM_cfg.xml
index 95a7796..33a9166 100644
--- a/ipacm/src/IPACM_cfg.xml
+++ b/ipacm/src/IPACM_cfg.xml
@@ -2,6 +2,7 @@
<system xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ipacm_cfg.xsd">
<ODUCFG>
<Mode>router</Mode>
+ <eMBMS_offload>0</eMBMS_offload>
</ODUCFG>
<IPACM>
<IPACMIface>