From 8a6345d05eb6cc8e52ae398a78afc2337d80edd6 Mon Sep 17 00:00:00 2001 From: "parthiban.selvaraj" Date: Tue, 16 Jul 2024 14:26:24 +0000 Subject: [PATCH 01/64] XYZ-999 : ConfigurableWanName for XB Reason for change: Solving Build errors Test Procedure: Updated in Jira. Risks: none Priority: P1 Signed-off-by: parthiban.selvaraj --- source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c | 3 ++- source/WanManager/wanmgr_dhcpv6_apis.c | 6 +++--- source/WanManager/wanmgr_interface_sm.c | 10 ++++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c index 849ffda3..756b5c73 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c @@ -266,7 +266,8 @@ int get_Virtual_Interface_FromPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU pVirtIf->Enable = TRUE; } -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* TODO: This is a workaround for the platforms using same Wan Name.*/ +//#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* TODO: This is a workaround for the platforms using same Wan Name.*/ +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) _ansc_memset(param_name, 0, sizeof(param_name)); _ansc_memset(param_value, 0, sizeof(param_value)); _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, instancenum, (virtInsNum + 1)); diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index ebd8b3ca..e2ef4b6c 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1825,7 +1825,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) /*TODO: Revisit this*/ //call function for changing the prlft and vallft // FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE : Handle Ip renew in handler thread. -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM_CBR2_PRODUCT_REQ_ if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) { CcspTraceError(("Life Time Setting Failed")); @@ -1898,7 +1898,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) CcspTraceInfo(("%s %d Updating SYSEVENT_CURRENT_WAN_IFNAME %s\n", __FUNCTION__, __LINE__,pVirtIf->IP.Ipv6Data.ifname)); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_CURRENT_WAN_IFNAME, pVirtIf->IP.Ipv6Data.ifname, 0); -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if 1//!(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM /* Enable accept ra */ WanMgr_Configure_accept_ra(pVirtIf, TRUE); @@ -1990,7 +1990,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) */ memset(cmdLine, 0, sizeof(cmdLine)); #ifndef _HUB4_PRODUCT_REQ_ - snprintf(cmdLine, sizeof(cmdLine), "sysevent set ipv6_prefix %s ",v6pref); + snprintf(cmdLine, sizeof(cmdLine), "sysevent set ipv6_prefix %s ", pVirtIf->IP.Ipv6Data.sitePrefix); #else #ifdef LAN_MGR_SUPPORT snprintf(cmdLine, sizeof(cmdLine), "sysevent set dhcpv6_raserver-restart "); diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index c86cb2fc..ca008430 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -971,7 +971,7 @@ static int checkIpv6AddressAssignedToBridge(char *IfaceName) char lanPrefix[BUFLEN_128] = {0}; int ret = RETURN_ERR; -#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM +#if 1//(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM CcspTraceWarning(("%s %d Ipv6 handled in PAM. No need to check here. \n",__FUNCTION__, __LINE__)); return RETURN_OK; #endif @@ -1373,6 +1373,7 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) ret = RETURN_ERR; } +#endif /** Unconfig IPv6. */ if ( WanManager_Ipv6AddrUtil(p_VirtIf->Name, DEL_ADDR,0,0) < 0) { @@ -1398,7 +1399,6 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_CONNECTION_STATE, WAN_STATUS_DOWN, 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_GLOBAL_IPV6_PREFIX_SET, "", 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); -#endif //RBUS_WAN_IP #if defined (RBUS_WAN_IP) @@ -1702,7 +1702,8 @@ static eWanState_t wan_transition_start(WanMgr_IfaceSM_Controller_t* pWanIfaceCt CcspTraceInfo(("%s %d - Already WAN interface %s created\n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) +//#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) +#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) if(pInterface->IfaceType != REMOTE_IFACE) { /* TODO: This is a workaround for the platforms using same Wan Name.*/ @@ -2766,7 +2767,8 @@ static eWanState_t wan_transition_exit(WanMgr_IfaceSM_Controller_t* pWanIfaceCtr Update_Interface_Status(); CcspTraceInfo(("%s %d - Interface '%s' - EXITING STATE MACHINE\n", __FUNCTION__, __LINE__, pInterface->Name)); -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) +//#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) +#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) /* TODO:This is a workaround for the platforms using same Wan Name.*/ if(pInterface->IfaceType != REMOTE_IFACE) { From 03d422161cb02636baf11dff5f5aaef04cecd32e Mon Sep 17 00:00:00 2001 From: "parthiban.selvaraj" Date: Tue, 16 Jul 2024 16:27:46 +0000 Subject: [PATCH 02/64] Adding WanManager version log Signed-off-by: parthiban.selvaraj --- configure.ac | 4 +++- source/WanManager/Makefile.am | 3 +++ source/WanManager/wanmgr_main.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index e41ff38f..75e87052 100644 --- a/configure.ac +++ b/configure.ac @@ -45,7 +45,9 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])], AC_SUBST(AM_DEFAULT_VERBOSITY)]) - +GIT_VERSION=$(git describe --tags --always --dirty 2>/dev/null || pwd) +AC_SUBST([GIT_VERSION], [$GIT_VERSION]) + [echo "$GIT_VERSION"] dnl ********************************** dnl checks for dependencies diff --git a/source/WanManager/Makefile.am b/source/WanManager/Makefile.am index dc4d1abf..d1b769d2 100644 --- a/source/WanManager/Makefile.am +++ b/source/WanManager/Makefile.am @@ -19,6 +19,8 @@ bin_PROGRAMS = wanmanager + + wanmanager_DEPENDENCIES = \ $(EXTRA_DEPENDENCIES) \ ${top_builddir}/source/TR-181/middle_layer_src/libCcspWanManager_middle_layer_src.la @@ -28,5 +30,6 @@ wanmanager_CPPFLAGS = -I$(top_srcdir)/source/TR-181/middle_layer_src \ -I${PKG_CONFIG_SYSROOT_DIR}$(includedir)/rbus wanmanager_CFLAGS = -DFEATURE_SUPPORT_RDKLOG $(DBUS_CFLAGS) $(SYSTEMD_CFLAGS) +wanmanager_CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\" wanmanager_SOURCES = wanmgr_webconfig_apis.c wanmgr_webconfig.c wanmgr_main.c wanmgr_ssp_action.c wanmgr_ssp_messagebus_interface.c wanmgr_core.c wanmgr_controller.c wanmgr_data.c wanmgr_sysevents.c wanmgr_interface_sm.c wanmgr_utils.c wanmgr_net_utils.c wanmgr_dhcpv4_apis.c wanmgr_dhcpv6_apis.c wanmgr_ipc.c wanmgr_dhcpv4_internal.c wanmgr_dhcpv6_internal.c wanmgr_policy_autowan_impl.c wanmgr_policy_auto_impl.c dm_pack_datamodel.c wanmgr_wan_failover.c wanmgr_policy_parallel_scan_impl.c wanmgr_dhcp_legacy_apis.c wanmanager_LDADD = $(wanmanager_DEPENDENCIES) -lccsp_common -lrdkloggers $(DBUS_LIBS) $(SYSTEMD_LDFLAGS) -lhal_platform -lapi_dhcpv4c -lnanomsg -lwebconfig_framework -lmsgpackc -ldhcp_client_utils -lprivilege -lrbus -lsecure_wrapper diff --git a/source/WanManager/wanmgr_main.c b/source/WanManager/wanmgr_main.c index e08c8dd4..e5fdba82 100644 --- a/source/WanManager/wanmgr_main.c +++ b/source/WanManager/wanmgr_main.c @@ -314,7 +314,7 @@ int main(int argc, char* argv[]) pComponentName = COMPONENT_NAME_WANMANAGER; rdk_logger_init(DEBUG_INI_NAME); - + CcspTraceInfo(("Version %s \n",GIT_VERSION )); //DATA INIT WanMgr_Data_Init(); From 7c64ad1c6e0e2521a36acf29896cdb54849e209b Mon Sep 17 00:00:00 2001 From: "parthiban.selvaraj" Date: Wed, 17 Jul 2024 10:44:28 +0000 Subject: [PATCH 03/64] Adding WanManager Version log Signed-off-by: parthiban.selvaraj --- configure.ac | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 75e87052..03f2d548 100644 --- a/configure.ac +++ b/configure.ac @@ -44,10 +44,10 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])], [AM_DEFAULT_VERBOSITY=1 AC_SUBST(AM_DEFAULT_VERBOSITY)]) - -GIT_VERSION=$(git describe --tags --always --dirty 2>/dev/null || pwd) -AC_SUBST([GIT_VERSION], [$GIT_VERSION]) - [echo "$GIT_VERSION"] +m4_define([GIT_VERSION], + m4_esyscmd_s([git describe --tags --always --dirty 2>/dev/null || echo "undefined"]) +) +AC_SUBST([GIT_VERSION], [GIT_VERSION]) dnl ********************************** dnl checks for dependencies From d072a94e695b3aacb1b88f6289b5e328445de6a9 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Tue, 30 Jul 2024 14:50:46 +0000 Subject: [PATCH 04/64] Handling IPv6 IANA and IAPD separately Signed-off-by: Parthiban Selvaraj --- configure.ac | 2 -- source/WanManager/Makefile.am | 2 -- source/WanManager/wanmgr_dhcpv6_apis.c | 37 +++++++++++++++++++------- source/WanManager/wanmgr_main.c | 1 - 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/configure.ac b/configure.ac index b69152af..6072d20d 100644 --- a/configure.ac +++ b/configure.ac @@ -50,8 +50,6 @@ m4_define([GIT_VERSION], AC_SUBST([GIT_VERSION], [GIT_VERSION]) - - dnl ********************************** dnl checks for dependencies dnl ********************************** diff --git a/source/WanManager/Makefile.am b/source/WanManager/Makefile.am index d1b769d2..ec96f1c7 100644 --- a/source/WanManager/Makefile.am +++ b/source/WanManager/Makefile.am @@ -19,8 +19,6 @@ bin_PROGRAMS = wanmanager - - wanmanager_DEPENDENCIES = \ $(EXTRA_DEPENDENCIES) \ ${top_builddir}/source/TR-181/middle_layer_src/libCcspWanManager_middle_layer_src.la diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index e2ef4b6c..65063a9d 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1616,12 +1616,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) pNewIpcMsg->maptAssigned, pNewIpcMsg->mapeAssigned, pNewIpcMsg->dnsAssigned, pNewIpcMsg->nameserver, pNewIpcMsg->nameserver1, pNewIpcMsg->aftrAssigned, pNewIpcMsg->aftr, pNewIpcMsg->isExpired)); + WANMGR_IPV6_DATA Ipv6DataTemp; // Holds the new lease from the IPC message + wanmgr_dchpv6_get_ipc_msg_info(&(Ipv6DataTemp), pNewIpcMsg); + /*Check lease expiry*/ if (pNewIpcMsg->isExpired) { CcspTraceInfo(("DHCP6LeaseExpired\n")); // update current IPv6 data - wanmgr_dchpv6_get_ipc_msg_info(&(pVirtIf->IP.Ipv6Data), pNewIpcMsg); WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_CONNECTION_IPV6_DOWN); //Free buffer @@ -1661,6 +1663,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } #endif } +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) + else if(pDhcp6cInfoCur->addrAssigned && Ipv6DataTemp.prefixAssigned) + { + CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); + strncpy(Ipv6DataTemp.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataTemp.address)); + pNewIpcMsg->addrAssigned = true; + } +#endif /* dhcp6c receives prefix delegation for LAN */ if (pNewIpcMsg->prefixAssigned && !IS_EMPTY_STRING(pNewIpcMsg->sitePrefix)) @@ -1736,6 +1746,15 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } } } +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) + else if(pDhcp6cInfoCur->prefixAssigned && Ipv6DataTemp.addrAssigned) + { + CcspTraceWarning(("%s %d IAPD is not assigned in this IPC msg, but we have IAPD configured from previous lease. Assuming only IANA renewed. \n", __FUNCTION__, __LINE__)); + strncpy(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix, sizeof(Ipv6DataTemp.sitePrefix)); + strncpy(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataTemp.pdIfAddress)); + pNewIpcMsg->prefixAssigned = true; + } +#endif #if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)&& !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM /* dhcp6c receives domain name information */ @@ -1791,24 +1810,24 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (connected) { - WANMGR_IPV6_DATA Ipv6DataTemp; - wanmgr_dchpv6_get_ipc_msg_info(&(Ipv6DataTemp), pNewIpcMsg); - #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_))//Do not compare if pdIfAddress and sitePrefix is empty. pdIfAddress Will be calculated while configuring LAN prefix. //TODO: V6 handled in PAM if ((strlen(Ipv6DataTemp.address) > 0 && strcmp(Ipv6DataTemp.address, pDhcp6cInfoCur->address)) || - ((Ipv6DataTemp.pdIfAddress) && (strlen(Ipv6DataTemp.pdIfAddress) > 0)&& - (strcmp(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress))) || - ((Ipv6DataTemp.sitePrefix) && (strlen(Ipv6DataTemp.sitePrefix) > 0)&& - (strcmp(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix)))|| + ((strlen(Ipv6DataTemp.pdIfAddress) > 0) && (strcmp(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress))) || + ((strlen(Ipv6DataTemp.sitePrefix) > 0) && (strcmp(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix)))|| #else if (strcmp(Ipv6DataTemp.address, pDhcp6cInfoCur->address) || strcmp(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress) || strcmp(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix) || #endif strcmp(Ipv6DataTemp.nameserver, pDhcp6cInfoCur->nameserver) || - strcmp(Ipv6DataTemp.nameserver1, pDhcp6cInfoCur->nameserver1)) + strcmp(Ipv6DataTemp.nameserver1, pDhcp6cInfoCur->nameserver1)) { CcspTraceInfo(("IPv6 configuration has been changed \n")); + CcspTraceInfo(("IPv6 address new %s : cur %s \n",Ipv6DataTemp.address , pDhcp6cInfoCur->address)); + CcspTraceInfo(("IPv6 pdIfAddress new %s : cur %s \n",Ipv6DataTemp.pdIfAddress , pDhcp6cInfoCur->pdIfAddress)); + CcspTraceInfo(("IPv6 sitePrefix new %s : cur %s \n",Ipv6DataTemp.sitePrefix , pDhcp6cInfoCur->sitePrefix)); + CcspTraceInfo(("IPv6 nameserver new %s : cur %s \n",Ipv6DataTemp.nameserver, pDhcp6cInfoCur->nameserver)); + CcspTraceInfo(("IPv6 nameserver1 new %s : cur %s \n",Ipv6DataTemp.nameserver1, pDhcp6cInfoCur->nameserver1)); pVirtIf->IP.Ipv6Changed = TRUE; CcspTraceInfo(("%s %d - RestartConnectivityCheck triggered. \n", __FUNCTION__, __LINE__)); diff --git a/source/WanManager/wanmgr_main.c b/source/WanManager/wanmgr_main.c index 7ba4551f..d5718eb3 100644 --- a/source/WanManager/wanmgr_main.c +++ b/source/WanManager/wanmgr_main.c @@ -313,7 +313,6 @@ int main(int argc, char* argv[]) pComponentName = COMPONENT_NAME_WANMANAGER; rdk_logger_init(DEBUG_INI_NAME); - CcspTraceInfo(("Version : %s \n",GIT_VERSION )); //DATA INIT From c124798a0ff64337e8eca1926e8a1faac81fe8d2 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Wed, 31 Jul 2024 11:29:41 +0000 Subject: [PATCH 05/64] Workaround to fix Force toggle Signed-off-by: Parthiban Selvaraj --- .../middle_layer_src/wanmgr_rdkbus_apis.c | 6 +- source/WanManager/wanmgr_dhcpv6_apis.c | 65 +++++++++---------- source/WanManager/wanmgr_interface_sm.c | 6 -- 3 files changed, 33 insertions(+), 44 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c index b0ba2674..4660fa9b 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c @@ -275,8 +275,7 @@ int get_Virtual_Interface_FromPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU pVirtIf->Enable = TRUE; } -//#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* TODO: This is a workaround for the platforms using same Wan Name.*/ -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) /* TODO: This is a workaround for the platforms using same Wan Name.*/ _ansc_memset(param_name, 0, sizeof(param_name)); _ansc_memset(param_value, 0, sizeof(param_value)); _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, instancenum, (virtInsNum + 1)); @@ -534,7 +533,8 @@ int write_Virtual_Interface_ToPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_ENABLE, instancenum, (virtInsNum + 1)); WanMgr_RdkBus_SetParamValuesToDB(param_name,param_value); -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* TODO: This is a workaround for the platforms using same Wan Name.*/ +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) && !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) + /* TODO: Build flag check is a workaround for the platforms using same Wan Name. */ memset(param_value, 0, sizeof(param_value)); memset(param_name, 0, sizeof(param_name)); AnscCopyString(param_value, pVirtIf->Name); diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index e8d0ca10..384b8381 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1605,7 +1605,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) memset(set_value, 0, sizeof(set_value)); - CcspTraceInfo(("prefixAssigned=%d prefixCmd=%d sitePrefix=%s pdIfAddress=%s \n" + CcspTraceInfo(("IPv6 new Lease info: \nprefixAssigned=%d prefixCmd=%d sitePrefix=%s pdIfAddress=%s \n" "prefixPltime=%d prefixVltime=%d\n" "addrAssigned=%d addrCmd=%d address=%s ifname=%s\n" "maptAssigned=%d mapeAssigned=%d\n" @@ -1616,8 +1616,8 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) pNewIpcMsg->maptAssigned, pNewIpcMsg->mapeAssigned, pNewIpcMsg->dnsAssigned, pNewIpcMsg->nameserver, pNewIpcMsg->nameserver1, pNewIpcMsg->aftrAssigned, pNewIpcMsg->aftr, pNewIpcMsg->isExpired)); - WANMGR_IPV6_DATA Ipv6DataTemp; // Holds the new lease from the IPC message - wanmgr_dchpv6_get_ipc_msg_info(&(Ipv6DataTemp), pNewIpcMsg); + WANMGR_IPV6_DATA Ipv6DataNew; // Holds the new lease from the IPC message + wanmgr_dchpv6_get_ipc_msg_info(&(Ipv6DataNew), pNewIpcMsg); /*Check lease expiry*/ if (pNewIpcMsg->isExpired) @@ -1664,11 +1664,12 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) #endif } #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - else if(pDhcp6cInfoCur->addrAssigned && Ipv6DataTemp.prefixAssigned) + else if(pDhcp6cInfoCur->addrAssigned && Ipv6DataNew.prefixAssigned) { CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); - strncpy(Ipv6DataTemp.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataTemp.address)); + strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); pNewIpcMsg->addrAssigned = true; + Ipv6DataNew.addrAssigned = true; } #endif @@ -1747,12 +1748,13 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } } #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - else if(pDhcp6cInfoCur->prefixAssigned && Ipv6DataTemp.addrAssigned) + else if(pDhcp6cInfoCur->prefixAssigned && Ipv6DataNew.addrAssigned) { CcspTraceWarning(("%s %d IAPD is not assigned in this IPC msg, but we have IAPD configured from previous lease. Assuming only IANA renewed. \n", __FUNCTION__, __LINE__)); - strncpy(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix, sizeof(Ipv6DataTemp.sitePrefix)); - strncpy(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataTemp.pdIfAddress)); + strncpy(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix, sizeof(Ipv6DataNew.sitePrefix)); + strncpy(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataNew.pdIfAddress)); pNewIpcMsg->prefixAssigned = true; + Ipv6DataNew.prefixAssigned = true; } #endif @@ -1772,11 +1774,11 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) /* Even when dhcp6c is not used to get the WAN interface IP address, * * use this message as a trigger to check the WAN interface IP. * * Maybe we've been assigned an address by SLAAC.*/ - char guAddr[IP_ADDR_LENGTH] = {0}; if (!pNewIpcMsg->addrAssigned) { char guAddrPrefix[IP_ADDR_LENGTH] = {0}; + char guAddr[IP_ADDR_LENGTH] = {0}; uint32_t prefixLen = 0; ANSC_STATUS r2; @@ -1791,7 +1793,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (strcmp(pDhcp6cInfoCur->address, guAddrPrefix)) { #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM - strncpy(pVirtIf->IP.Ipv6Data.address,guAddrPrefix, sizeof(pVirtIf->IP.Ipv6Data.address)); + strncpy(Ipv6DataNew.address, guAddr, sizeof(Ipv6DataNew.address)-1); pNewIpcMsg->addrAssigned = true; #else syscfg_set_string(SYSCFG_FIELD_IPV6_ADDRESS, guAddrPrefix); @@ -1812,31 +1814,31 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (connected) { #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_))//Do not compare if pdIfAddress and sitePrefix is empty. pdIfAddress Will be calculated while configuring LAN prefix. //TODO: V6 handled in PAM - if ((strlen(Ipv6DataTemp.address) > 0 && strcmp(Ipv6DataTemp.address, pDhcp6cInfoCur->address)) || - ((strlen(Ipv6DataTemp.pdIfAddress) > 0) && (strcmp(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress))) || - ((strlen(Ipv6DataTemp.sitePrefix) > 0) && (strcmp(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix)))|| + if ((strlen(Ipv6DataNew.address) > 0 && strcmp(Ipv6DataNew.address, pDhcp6cInfoCur->address)) || + ((strlen(Ipv6DataNew.pdIfAddress) > 0) && (strcmp(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress))) || + ((strlen(Ipv6DataNew.sitePrefix) > 0) && (strcmp(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix)))|| #else - if (strcmp(Ipv6DataTemp.address, pDhcp6cInfoCur->address) || - strcmp(Ipv6DataTemp.pdIfAddress, pDhcp6cInfoCur->pdIfAddress) || - strcmp(Ipv6DataTemp.sitePrefix, pDhcp6cInfoCur->sitePrefix) || + if (strcmp(Ipv6DataNew.address, pDhcp6cInfoCur->address) || + strcmp(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress) || + strcmp(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix) || #endif - strcmp(Ipv6DataTemp.nameserver, pDhcp6cInfoCur->nameserver) || - strcmp(Ipv6DataTemp.nameserver1, pDhcp6cInfoCur->nameserver1)) + strcmp(Ipv6DataNew.nameserver, pDhcp6cInfoCur->nameserver) || + strcmp(Ipv6DataNew.nameserver1, pDhcp6cInfoCur->nameserver1)) { CcspTraceInfo(("IPv6 configuration has been changed \n")); - CcspTraceInfo(("IPv6 address new %s : cur %s \n",Ipv6DataTemp.address , pDhcp6cInfoCur->address)); - CcspTraceInfo(("IPv6 pdIfAddress new %s : cur %s \n",Ipv6DataTemp.pdIfAddress , pDhcp6cInfoCur->pdIfAddress)); - CcspTraceInfo(("IPv6 sitePrefix new %s : cur %s \n",Ipv6DataTemp.sitePrefix , pDhcp6cInfoCur->sitePrefix)); - CcspTraceInfo(("IPv6 nameserver new %s : cur %s \n",Ipv6DataTemp.nameserver, pDhcp6cInfoCur->nameserver)); - CcspTraceInfo(("IPv6 nameserver1 new %s : cur %s \n",Ipv6DataTemp.nameserver1, pDhcp6cInfoCur->nameserver1)); + CcspTraceInfo(("IPv6 address new %s : cur %s \n",Ipv6DataNew.address , pDhcp6cInfoCur->address)); + CcspTraceInfo(("IPv6 pdIfAddress new %s : cur %s \n",Ipv6DataNew.pdIfAddress , pDhcp6cInfoCur->pdIfAddress)); + CcspTraceInfo(("IPv6 sitePrefix new %s : cur %s \n",Ipv6DataNew.sitePrefix , pDhcp6cInfoCur->sitePrefix)); + CcspTraceInfo(("IPv6 nameserver new %s : cur %s \n",Ipv6DataNew.nameserver, pDhcp6cInfoCur->nameserver)); + CcspTraceInfo(("IPv6 nameserver1 new %s : cur %s \n",Ipv6DataNew.nameserver1, pDhcp6cInfoCur->nameserver1)); pVirtIf->IP.Ipv6Changed = TRUE; CcspTraceInfo(("%s %d - RestartConnectivityCheck triggered. \n", __FUNCTION__, __LINE__)); char param_name[256] = {0}; snprintf(param_name, sizeof(param_name), "Device.X_RDK_WanManager.Interface.%d.VirtualInterface.%d.IP.IPv6Address", pVirtIf->baseIfIdx+1, pVirtIf->VirIfIdx+1); - WanMgr_Rbus_EventPublishHandler(param_name, Ipv6DataTemp.address,RBUS_STRING); + WanMgr_Rbus_EventPublishHandler(param_name, Ipv6DataNew.address,RBUS_STRING); snprintf(param_name, sizeof(param_name), "Device.X_RDK_WanManager.Interface.%d.VirtualInterface.%d.IP.IPv6Prefix", pVirtIf->baseIfIdx+1, pVirtIf->VirIfIdx+1); - WanMgr_Rbus_EventPublishHandler(param_name, Ipv6DataTemp.sitePrefix,RBUS_STRING); + WanMgr_Rbus_EventPublishHandler(param_name, Ipv6DataNew.sitePrefix,RBUS_STRING); pVirtIf->IP.RestartConnectivityCheck = TRUE; } @@ -1855,15 +1857,8 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) pVirtIf->IP.Ipv6Renewed = TRUE; } // update current IPv6 Data - memcpy(&(pVirtIf->IP.Ipv6Data), &(Ipv6DataTemp), sizeof(WANMGR_IPV6_DATA)); + memcpy(&(pVirtIf->IP.Ipv6Data), &(Ipv6DataNew), sizeof(WANMGR_IPV6_DATA)); pVirtIf->IP.Ipv6Status = WAN_IFACE_IPV6_STATE_UP; -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM - //If only Ipv6 prefix is renewed, IPv6 address is not shared in the lease details. Use the detected Ipv6 address. - if(strlen(guAddr) > 0 && strlen(pVirtIf->IP.Ipv6Data.address) <= 0) - { - strncpy(pVirtIf->IP.Ipv6Data.address, guAddr, sizeof(pVirtIf->IP.Ipv6Data.address)); - } -#endif } #ifdef FEATURE_MAPT @@ -1925,9 +1920,10 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) CcspTraceInfo(("%s %d Updating SYSEVENT_CURRENT_WAN_IFNAME %s\n", __FUNCTION__, __LINE__,pVirtIf->IP.Ipv6Data.ifname)); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_CURRENT_WAN_IFNAME, pVirtIf->IP.Ipv6Data.ifname, 0); -#if 1//!(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: Review toggle for the devices using IANA /* Enable accept ra */ WanMgr_Configure_accept_ra(pVirtIf, TRUE); +#endif int index = strcspn(pVirtIf->IP.Ipv6Data.sitePrefix, "/"); if (index < strlen(pVirtIf->IP.Ipv6Data.sitePrefix)) @@ -1959,7 +1955,6 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_TR_EROUTER_DHCPV6_CLIENT_PREFIX, pVirtIf->IP.Ipv6Data.sitePrefix, 0); } } -#endif #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* moved from PAM */ int ret = RETURN_OK; diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index d5a9a720..3cc814ca 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1014,10 +1014,6 @@ static int checkIpv6AddressAssignedToBridge(char *IfaceName) char lanPrefix[BUFLEN_128] = {0}; int ret = RETURN_ERR; -#if 1//(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM - CcspTraceWarning(("%s %d Ipv6 handled in PAM. No need to check here. \n",__FUNCTION__, __LINE__)); - return RETURN_OK; -#endif sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_GLOBAL_IPV6_PREFIX_SET, lanPrefix, sizeof(lanPrefix)); if(strlen(lanPrefix) > 0) @@ -1748,7 +1744,6 @@ static eWanState_t wan_transition_start(WanMgr_IfaceSM_Controller_t* pWanIfaceCt CcspTraceInfo(("%s %d - Already WAN interface %s created\n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } -//#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) #if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) if(pInterface->IfaceType != REMOTE_IFACE) { @@ -2821,7 +2816,6 @@ static eWanState_t wan_transition_exit(WanMgr_IfaceSM_Controller_t* pWanIfaceCtr Update_Interface_Status(); CcspTraceInfo(("%s %d - Interface '%s' - EXITING STATE MACHINE\n", __FUNCTION__, __LINE__, pInterface->Name)); -//#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) #if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) /* TODO:This is a workaround for the platforms using same Wan Name.*/ if(pInterface->IfaceType != REMOTE_IFACE) From 3a84b22fb1a06ddd81e76b109e634beaffe6b7e8 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 2 Aug 2024 10:44:15 +0000 Subject: [PATCH 06/64] Adding funtions for Router solicit and parsing RA Signed-off-by: S-Parthiban-Selvaraj --- .../wanmgr_dml_iface_v2_apis.c | 4 +- source/WanManager/wanmgr_net_utils.c | 347 +++++++++++++++++- source/WanManager/wanmgr_net_utils.h | 1 + source/WanManager/wanmgr_sysevents.c | 10 +- 4 files changed, 356 insertions(+), 6 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c index 58976c3c..6706c077 100644 --- a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c @@ -1204,7 +1204,9 @@ BOOL WanIfSelectionCfg_SetParamBoolValue(ANSC_HANDLE hInsContext, char* ParamNam if (strcmp(ParamName, "RequiresReboot") == 0) { - pWanDmlIface->Selection.RequiresReboot = bValue; + //pWanDmlIface->Selection.RequiresReboot = bValue; + //WanManager_send_and_receive_rs("erouter0"); + WanManager_send_and_receive_rs_2(); ret = TRUE; } diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 572670d4..671d0bca 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -44,8 +44,11 @@ #include #include #include - -#if defined(FEATURE_464XLAT) +#include +#include +#include +#include +#include #include #include #include @@ -54,7 +57,6 @@ #include #include #include -#endif #define BROADCAST_IP "255.255.255.255" /* To ignore link local addresses configured as DNS servers, @@ -2652,3 +2654,342 @@ ANSC_STATUS WanManager_get_interface_mac(char *interfaceName, char* macAddress, return returnStatus; } + +//Send and receive RS +#define MAX_BUFFER_SIZE 1500 +#define RETRIES 3 +#define TIMEOUT 2 + +unsigned short checksum(void *b, int len) +{ + unsigned short *buf = b; + unsigned int sum = 0; + unsigned short result; + + for (sum = 0; len > 1; len -= 2) + sum += *buf++; + if (len == 1) + sum += *(unsigned char*)buf; + sum = (sum >> 16) + (sum & 0xFFFF); + sum += (sum >> 16); + result = ~sum; + return result; +} + +void parse_router_advertisement(unsigned char *buffer, ssize_t len) +{ + struct icmp6_hdr *hdr = (struct icmp6_hdr *)buffer; + + if (hdr->icmp6_type == ND_ROUTER_ADVERT) + { + struct nd_router_advert *ra = (struct nd_router_advert *)buffer; + unsigned char *opt_ptr = buffer + sizeof(struct nd_router_advert); + ssize_t opt_len = len - sizeof(struct nd_router_advert); + + CcspTraceError(("%s %d: Received Router Advertisement\n", __FUNCTION__, __LINE__)); + CcspTraceError(("%s %d:Router Lifetime: %d\n",__FUNCTION__, __LINE__,ntohs(ra->nd_ra_router_lifetime))); + while (opt_len > 0) + { + struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)opt_ptr; + + if (opt_hdr->nd_opt_type == ND_OPT_PREFIX_INFORMATION) + { + struct nd_opt_prefix_info *prefix_info = (struct nd_opt_prefix_info *)opt_ptr; + char addr_str[INET6_ADDRSTRLEN]; + + inet_ntop(AF_INET6, &prefix_info->nd_opt_pi_prefix, addr_str, sizeof(addr_str)); + CcspTraceError(("%s %d: Default Route Prefix: %s/%d\n", __FUNCTION__, __LINE__, addr_str, prefix_info->nd_opt_pi_prefix_len)); + } + opt_len -= opt_hdr->nd_opt_len * 8; + opt_ptr += opt_hdr->nd_opt_len * 8; + } + } +} + +void WanManager_send_and_receive_rs(const char *interface) +{ + int sock; + struct timeval tv; + unsigned char buffer[MAX_BUFFER_SIZE]; + ssize_t len; + int retries = 0; + + CcspTraceInfo(("%s %d PARTHI %s ****************************\n", __FUNCTION__, __LINE__, interface)); + + struct sockaddr_ll addr = {0}; + struct icmp6_hdr rs_hdr = {0}; + + // Create raw socket for ICMPv6 + //sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6)); + sock = socket(AF_PACKET, SOCK_RAW, IPPROTO_ICMPV6); + //sock = socket(AF_PACKET, SOCK_DGRAM, IPPROTO_ICMPV6); + if (sock < 0) + { + CcspTraceError(("%s %d: socket creation failed\n", __FUNCTION__, __LINE__)); + perror("socket"); + return; + } + + // Set receive timeout + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + // setsockopt (sock, SOL_SOCKET, SO_DONTROUTE, &(int){1}, sizeof (int)); +// setsockopt (sock, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &(int){ 1 }, sizeof (int)); + //setsockopt (sock, IPPROTO_IPV6, IPV6_HDRINCL , &optval, sizeof(int)); + + + // Set the interface index + addr.sll_ifindex = if_nametoindex(interface); + if (addr.sll_ifindex == 0) + { + perror("if_nametoindex"); + CcspTraceError(("%s %d: get interface index of %s failed\n", __FUNCTION__, __LINE__, interface)); + close(sock); + return; + } + CcspTraceError(("%s %d: get interface index of %s addr.sll_ifindex %d\n", __FUNCTION__, __LINE__, interface, addr.sll_ifindex)); + + // Set the destination to the all-routers multicast address + addr.sll_family = AF_PACKET; + addr.sll_protocol = htons(ETH_P_IPV6); + addr.sll_halen = 6; + addr.sll_addr[0] = 0x33; + addr.sll_addr[1] = 0x33; + addr.sll_addr[2] = 0x00; + addr.sll_addr[3] = 0x00; + addr.sll_addr[4] = 0x00; + addr.sll_addr[5] = 0x02; + + // Create the Router Solicitation ICMPv6 header + rs_hdr.icmp6_type = ND_ROUTER_SOLICIT; + rs_hdr.icmp6_code = 0; + rs_hdr.icmp6_cksum = 0; +// rs_hdr.icmp6_cksum = checksum(&rs_hdr, sizeof(rs_hdr)); + + while (retries < RETRIES) + { + // Send Router Solicitation + if (sendto(sock, &rs_hdr, sizeof(rs_hdr), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) + { + perror("sendto"); + CcspTraceError(("%s %d: Router Solicitation send failed %s \n", __FUNCTION__, __LINE__, strerror(errno))); + close(sock); + return; + } + + // Receive Router Advertisement + len = recv(sock, buffer, MAX_BUFFER_SIZE, 0); + if (len < 0) + { + if (errno == EAGAIN || errno == EWOULDBLOCK) + { + printf("No response, retrying...\n"); + CcspTraceWarning(("%s %d: No response, retrying... %s\n", __FUNCTION__, __LINE__, strerror(errno))); + retries++; + continue; + } else { + perror("recv"); + CcspTraceError(("%s %d: Router Solicitation recv failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); + close(sock); + return; + } + } + + // Parse the Router Advertisement + parse_router_advertisement(buffer, len); + } + + if (retries == RETRIES) + { + CcspTraceError(("%s %d: No Router Advertisement received after %d retries\n", __FUNCTION__, __LINE__, RETRIES)); + } + + close(sock); +} + +//######################## +#define RS_MSG_SIZE 8 +#define RA_MSG_SIZE 1024 +#if !__USE_KERNEL_IPV6_DEFS +struct in6_pktinfo { + struct in6_addr ipi6_addr; + unsigned int ipi6_ifindex; +}; +#endif + +int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) { + struct icmp6_hdr rs_hdr; + memset(&rs_hdr, 0, sizeof(rs_hdr)); + rs_hdr.icmp6_type = ND_ROUTER_SOLICIT; + + CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + struct msghdr msg; + struct iovec iov; + struct sockaddr_in6 src_addr; + struct cmsghdr *cmsg; + char cmsgbuf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; + + memset(&msg, 0, sizeof(msg)); + memset(&src_addr, 0, sizeof(src_addr)); + memset(cmsgbuf, 0, sizeof(cmsgbuf)); + + src_addr.sin6_family = AF_INET6; + src_addr.sin6_addr = in6addr_any; + + iov.iov_base = &rs_hdr; + iov.iov_len = sizeof(rs_hdr); + + msg.msg_name = dest_addr; + msg.msg_namelen = sizeof(*dest_addr); + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + msg.msg_control = cmsgbuf; + msg.msg_controllen = sizeof(cmsgbuf); + + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); + cmsg->cmsg_level = IPPROTO_IPV6; + cmsg->cmsg_type = IPV6_PKTINFO; + + struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); + memset(pktinfo, 0, sizeof(struct in6_pktinfo)); + + pktinfo->ipi6_ifindex = if_nametoindex(if_name); +/* + int if_index = if_nametoindex(if_name); + if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &if_index, sizeof(if_index)) < 0) { + perror("setsockopt"); + CcspTraceError(("%s %d: PARTHI %s\n", __FUNCTION__, __LINE__, strerror(errno))); + return -1; + } +*/ + if (sendmsg(sockfd, &msg, 0) < 0) { + perror("sendmsg"); + CcspTraceError(("%s %d: PARTHI sendmsg failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); + return -1; + } + CcspTraceError(("%s %d: PARTHI %d \n", __FUNCTION__, __LINE__, pktinfo->ipi6_ifindex)); + + return 0; +} + +void receive_router_advert(int sockfd) { + char buffer[RA_MSG_SIZE]; + struct sockaddr_in6 src_addr; + socklen_t addrlen = sizeof(src_addr); + ssize_t len; + + len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&src_addr, &addrlen); + if (len < 0) { + perror("recvfrom"); + CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + } + + CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); +/* struct icmp6_hdr *ra_hdr = (struct icmp6_hdr *)buf; + if (ra_hdr->icmp6_type == ND_ROUTER_ADVERT) { + printf("Received Router Advertisement\n"); + CcspTraceError(("%s %d: PARTHI iReceived Router Advertisement\n", __FUNCTION__, __LINE__)); + // Parse the RA message to extract the default route + // This is a simplified example, real parsing would be more complex + struct nd_router_advert *ra = (struct nd_router_advert *)buf; + printf("Router Lifetime: %d\n", ntohs(ra->nd_ra_router_lifetime)); + CcspTraceError(("Router Lifetime: %d\n", ntohs(ra->nd_ra_router_lifetime))); + }*/ + + struct icmp6_hdr *hdr = (struct icmp6_hdr *)buffer; + + if (hdr->icmp6_type == ND_ROUTER_ADVERT) + { + struct nd_router_advert *ra = (struct nd_router_advert *)buffer; + unsigned char *opt_ptr = buffer + sizeof(struct nd_router_advert); + ssize_t opt_len = len - sizeof(struct nd_router_advert); + + CcspTraceError(("%s %d: Received Router Advertisement\n", __FUNCTION__, __LINE__)); + CcspTraceError(("%s %d:Router Lifetime: %d\n",__FUNCTION__, __LINE__,ntohs(ra->nd_ra_router_lifetime))); + while (opt_len > 0) + { + struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)opt_ptr; + + CcspTraceError(("%s %d: Option %d\n", __FUNCTION__, __LINE__, opt_hdr->nd_opt_type)); + CcspTraceError(("%s %d: Option len %d\n", __FUNCTION__, __LINE__, opt_hdr->nd_opt_len)); + if (opt_hdr->nd_opt_type == ND_OPT_PREFIX_INFORMATION) + { + struct nd_opt_prefix_info *prefix_info = (struct nd_opt_prefix_info *)opt_ptr; + char addr_str[INET6_ADDRSTRLEN]; + + inet_ntop(AF_INET6, &prefix_info->nd_opt_pi_prefix, addr_str, sizeof(addr_str)); + CcspTraceError(("%s %d: Default Route Prefix: %s/%d\n", __FUNCTION__, __LINE__, addr_str, prefix_info->nd_opt_pi_prefix_len)); + } + opt_len -= opt_hdr->nd_opt_len * 8; + opt_ptr += opt_hdr->nd_opt_len * 8; + } + } + +} + +void WanManager_send_and_receive_rs_2() { + int sockfd; + struct sockaddr_in6 dest_addr; + const char *if_name = "erouter0"; // Change this to your network interface + + CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); + if (sockfd < 0) { + perror("socket"); + exit(EXIT_FAILURE); + } + + memset(&dest_addr, 0, sizeof(dest_addr)); + dest_addr.sin6_family = AF_INET6; + inet_pton(AF_INET6, "ff02::2", &dest_addr.sin6_addr); + + struct timeval tv; + tv.tv_sec = TIMEOUT; + tv.tv_usec = 0; + setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + setsockopt (sockfd, SOL_SOCKET, SO_DONTROUTE, &(int){1}, sizeof (int)); + setsockopt (sockfd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &(int){ 1 }, sizeof (int)); + setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); + setsockopt (sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); + + CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + if( send_router_solicit(sockfd, &dest_addr, if_name) == 0) + { + receive_router_advert(sockfd); + CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + } + + close(sockfd); + return 0; +} + +#if 0 +void WanManager_send_and_receive_rs_3() +{ + int fd = socket (PF_INET6, SOCK_RAW, IPPROTO_ICMPV6); + + struct sockaddr_in6 tgt; + fcntl (fd, F_SETFD, FD_CLOEXEC); + + /* set ICMPv6 filter */ + { + struct icmp6_filter f; + + ICMP6_FILTER_SETBLOCKALL (&f); + ICMP6_FILTER_SETPASS (nd_type_advert, &f); + setsockopt (fd, IPPROTO_ICMPV6, ICMP6_FILTER, &f, sizeof (f)); + } + + setsockopt (fd, SOL_SOCKET, SO_DONTROUTE, &(int){ 1 }, sizeof (int)); + + /* sets Hop-by-hop limit to 255 */ + setsockopt (fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &(int){ 1 }, sizeof (int)); + + setsockopt (fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); + setsockopt (fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); + + +} +#endif diff --git a/source/WanManager/wanmgr_net_utils.h b/source/WanManager/wanmgr_net_utils.h index 9d5ee780..f73c09ac 100644 --- a/source/WanManager/wanmgr_net_utils.h +++ b/source/WanManager/wanmgr_net_utils.h @@ -256,4 +256,5 @@ void WanManager_PrintBootEvents (WanBootEventState state); BOOL IsValidIpAddress(int32_t af, const char *address); +void WanManager_send_and_receive_rs(const char *interface); #endif // _WANMGR_NET_UTILS_H_ diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 33e99787..8e85723e 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -1191,6 +1191,9 @@ int Force_IPv6_toggle (char* wanInterface) int ret = 0; CcspTraceInfo(("%s %d force toggle initiated\n", __FUNCTION__, __LINE__)); + //WanManager_send_and_receive_rs(wanInterface); + WanManager_send_and_receive_rs_2(); +/* if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "1") != 0) { CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); @@ -1200,6 +1203,7 @@ int Force_IPv6_toggle (char* wanInterface) { CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); } +*/ sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); //Reset toggle flag to false. return ret; @@ -1208,10 +1212,11 @@ int Force_IPv6_toggle (char* wanInterface) void wanmgr_Ipv6Toggle (void) { char v6Toggle[BUFLEN_128] = {0}; -#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM +#if 1//(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM /*Ipv6 handled in PAM. No Toggle Needed. */ + WanManager_send_and_receive_rs_2(); return; -#endif +#else sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, v6Toggle, sizeof(v6Toggle)); @@ -1224,6 +1229,7 @@ void wanmgr_Ipv6Toggle (void) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); } } +#endif } /* From 62c630b65530ad471c1f766fdce548d595ec4d2b Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 2 Aug 2024 11:20:40 +0000 Subject: [PATCH 07/64] RS RA funtions clean up Signed-off-by: S-Parthiban-Selvaraj --- .../wanmgr_dml_iface_v2_apis.c | 4 +- source/WanManager/wanmgr_interface_sm.c | 2 +- source/WanManager/wanmgr_net_utils.c | 248 ++---------------- source/WanManager/wanmgr_net_utils.h | 2 +- source/WanManager/wanmgr_sysevents.c | 10 +- 5 files changed, 34 insertions(+), 232 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c index 6706c077..58976c3c 100644 --- a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c @@ -1204,9 +1204,7 @@ BOOL WanIfSelectionCfg_SetParamBoolValue(ANSC_HANDLE hInsContext, char* ParamNam if (strcmp(ParamName, "RequiresReboot") == 0) { - //pWanDmlIface->Selection.RequiresReboot = bValue; - //WanManager_send_and_receive_rs("erouter0"); - WanManager_send_and_receive_rs_2(); + pWanDmlIface->Selection.RequiresReboot = bValue; ret = TRUE; } diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 3cc814ca..56537dc8 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -391,7 +391,7 @@ static BOOL WanMgr_RestartFindExistingLink (WanMgr_IfaceSM_Controller_t* pWanIfa p_VirtIf->VLAN.Status = WAN_IFACE_LINKSTATUS_UP; ret = TRUE; /* If we are here. WanManager is restarted. Do a IPv6 toggle to avoid DAD. */ - Force_IPv6_toggle(p_VirtIf->Name); + WanManager_send_and_receive_rs(p_VirtIf->Name); } } diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 671d0bca..423ce135 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -2656,174 +2656,20 @@ ANSC_STATUS WanManager_get_interface_mac(char *interfaceName, char* macAddress, } //Send and receive RS -#define MAX_BUFFER_SIZE 1500 -#define RETRIES 3 #define TIMEOUT 2 - -unsigned short checksum(void *b, int len) -{ - unsigned short *buf = b; - unsigned int sum = 0; - unsigned short result; - - for (sum = 0; len > 1; len -= 2) - sum += *buf++; - if (len == 1) - sum += *(unsigned char*)buf; - sum = (sum >> 16) + (sum & 0xFFFF); - sum += (sum >> 16); - result = ~sum; - return result; -} - -void parse_router_advertisement(unsigned char *buffer, ssize_t len) -{ - struct icmp6_hdr *hdr = (struct icmp6_hdr *)buffer; - - if (hdr->icmp6_type == ND_ROUTER_ADVERT) - { - struct nd_router_advert *ra = (struct nd_router_advert *)buffer; - unsigned char *opt_ptr = buffer + sizeof(struct nd_router_advert); - ssize_t opt_len = len - sizeof(struct nd_router_advert); - - CcspTraceError(("%s %d: Received Router Advertisement\n", __FUNCTION__, __LINE__)); - CcspTraceError(("%s %d:Router Lifetime: %d\n",__FUNCTION__, __LINE__,ntohs(ra->nd_ra_router_lifetime))); - while (opt_len > 0) - { - struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)opt_ptr; - - if (opt_hdr->nd_opt_type == ND_OPT_PREFIX_INFORMATION) - { - struct nd_opt_prefix_info *prefix_info = (struct nd_opt_prefix_info *)opt_ptr; - char addr_str[INET6_ADDRSTRLEN]; - - inet_ntop(AF_INET6, &prefix_info->nd_opt_pi_prefix, addr_str, sizeof(addr_str)); - CcspTraceError(("%s %d: Default Route Prefix: %s/%d\n", __FUNCTION__, __LINE__, addr_str, prefix_info->nd_opt_pi_prefix_len)); - } - opt_len -= opt_hdr->nd_opt_len * 8; - opt_ptr += opt_hdr->nd_opt_len * 8; - } - } -} - -void WanManager_send_and_receive_rs(const char *interface) -{ - int sock; - struct timeval tv; - unsigned char buffer[MAX_BUFFER_SIZE]; - ssize_t len; - int retries = 0; - - CcspTraceInfo(("%s %d PARTHI %s ****************************\n", __FUNCTION__, __LINE__, interface)); - - struct sockaddr_ll addr = {0}; - struct icmp6_hdr rs_hdr = {0}; - - // Create raw socket for ICMPv6 - //sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6)); - sock = socket(AF_PACKET, SOCK_RAW, IPPROTO_ICMPV6); - //sock = socket(AF_PACKET, SOCK_DGRAM, IPPROTO_ICMPV6); - if (sock < 0) - { - CcspTraceError(("%s %d: socket creation failed\n", __FUNCTION__, __LINE__)); - perror("socket"); - return; - } - - // Set receive timeout - tv.tv_sec = TIMEOUT; - tv.tv_usec = 0; - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - // setsockopt (sock, SOL_SOCKET, SO_DONTROUTE, &(int){1}, sizeof (int)); -// setsockopt (sock, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &(int){ 1 }, sizeof (int)); - //setsockopt (sock, IPPROTO_IPV6, IPV6_HDRINCL , &optval, sizeof(int)); - - - // Set the interface index - addr.sll_ifindex = if_nametoindex(interface); - if (addr.sll_ifindex == 0) - { - perror("if_nametoindex"); - CcspTraceError(("%s %d: get interface index of %s failed\n", __FUNCTION__, __LINE__, interface)); - close(sock); - return; - } - CcspTraceError(("%s %d: get interface index of %s addr.sll_ifindex %d\n", __FUNCTION__, __LINE__, interface, addr.sll_ifindex)); - - // Set the destination to the all-routers multicast address - addr.sll_family = AF_PACKET; - addr.sll_protocol = htons(ETH_P_IPV6); - addr.sll_halen = 6; - addr.sll_addr[0] = 0x33; - addr.sll_addr[1] = 0x33; - addr.sll_addr[2] = 0x00; - addr.sll_addr[3] = 0x00; - addr.sll_addr[4] = 0x00; - addr.sll_addr[5] = 0x02; - - // Create the Router Solicitation ICMPv6 header - rs_hdr.icmp6_type = ND_ROUTER_SOLICIT; - rs_hdr.icmp6_code = 0; - rs_hdr.icmp6_cksum = 0; -// rs_hdr.icmp6_cksum = checksum(&rs_hdr, sizeof(rs_hdr)); - - while (retries < RETRIES) - { - // Send Router Solicitation - if (sendto(sock, &rs_hdr, sizeof(rs_hdr), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) - { - perror("sendto"); - CcspTraceError(("%s %d: Router Solicitation send failed %s \n", __FUNCTION__, __LINE__, strerror(errno))); - close(sock); - return; - } - - // Receive Router Advertisement - len = recv(sock, buffer, MAX_BUFFER_SIZE, 0); - if (len < 0) - { - if (errno == EAGAIN || errno == EWOULDBLOCK) - { - printf("No response, retrying...\n"); - CcspTraceWarning(("%s %d: No response, retrying... %s\n", __FUNCTION__, __LINE__, strerror(errno))); - retries++; - continue; - } else { - perror("recv"); - CcspTraceError(("%s %d: Router Solicitation recv failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); - close(sock); - return; - } - } - - // Parse the Router Advertisement - parse_router_advertisement(buffer, len); - } - - if (retries == RETRIES) - { - CcspTraceError(("%s %d: No Router Advertisement received after %d retries\n", __FUNCTION__, __LINE__, RETRIES)); - } - - close(sock); -} - -//######################## #define RS_MSG_SIZE 8 #define RA_MSG_SIZE 1024 -#if !__USE_KERNEL_IPV6_DEFS struct in6_pktinfo { struct in6_addr ipi6_addr; unsigned int ipi6_ifindex; }; -#endif int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) { struct icmp6_hdr rs_hdr; memset(&rs_hdr, 0, sizeof(rs_hdr)); rs_hdr.icmp6_type = ND_ROUTER_SOLICIT; - CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + CcspTraceInfo(("%s %d: \n", __FUNCTION__, __LINE__)); struct msghdr msg; struct iovec iov; struct sockaddr_in6 src_addr; @@ -2856,48 +2702,31 @@ int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char * memset(pktinfo, 0, sizeof(struct in6_pktinfo)); pktinfo->ipi6_ifindex = if_nametoindex(if_name); -/* - int if_index = if_nametoindex(if_name); - if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &if_index, sizeof(if_index)) < 0) { - perror("setsockopt"); - CcspTraceError(("%s %d: PARTHI %s\n", __FUNCTION__, __LINE__, strerror(errno))); - return -1; - } -*/ if (sendmsg(sockfd, &msg, 0) < 0) { - perror("sendmsg"); - CcspTraceError(("%s %d: PARTHI sendmsg failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); + CcspTraceError(("%s %d: sendmsg failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); return -1; } - CcspTraceError(("%s %d: PARTHI %d \n", __FUNCTION__, __LINE__, pktinfo->ipi6_ifindex)); + CcspTraceInfo(("%s %d: RS sent from interface %s and index %d \n", __FUNCTION__, __LINE__, if_name, pktinfo->ipi6_ifindex)); return 0; } -void receive_router_advert(int sockfd) { +int receive_router_advert(int sockfd) +{ + int ret = -1; char buffer[RA_MSG_SIZE]; struct sockaddr_in6 src_addr; socklen_t addrlen = sizeof(src_addr); ssize_t len; len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&src_addr, &addrlen); - if (len < 0) { + if (len < 0) + { perror("recvfrom"); - CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + CcspTraceError(("%s %d: recvfrom Failed %s \n", __FUNCTION__, __LINE__, strerror(errno))); + return -1; } - CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); -/* struct icmp6_hdr *ra_hdr = (struct icmp6_hdr *)buf; - if (ra_hdr->icmp6_type == ND_ROUTER_ADVERT) { - printf("Received Router Advertisement\n"); - CcspTraceError(("%s %d: PARTHI iReceived Router Advertisement\n", __FUNCTION__, __LINE__)); - // Parse the RA message to extract the default route - // This is a simplified example, real parsing would be more complex - struct nd_router_advert *ra = (struct nd_router_advert *)buf; - printf("Router Lifetime: %d\n", ntohs(ra->nd_ra_router_lifetime)); - CcspTraceError(("Router Lifetime: %d\n", ntohs(ra->nd_ra_router_lifetime))); - }*/ - struct icmp6_hdr *hdr = (struct icmp6_hdr *)buffer; if (hdr->icmp6_type == ND_ROUTER_ADVERT) @@ -2906,8 +2735,7 @@ void receive_router_advert(int sockfd) { unsigned char *opt_ptr = buffer + sizeof(struct nd_router_advert); ssize_t opt_len = len - sizeof(struct nd_router_advert); - CcspTraceError(("%s %d: Received Router Advertisement\n", __FUNCTION__, __LINE__)); - CcspTraceError(("%s %d:Router Lifetime: %d\n",__FUNCTION__, __LINE__,ntohs(ra->nd_ra_router_lifetime))); + CcspTraceInfo(("%s %d: Received Router Advertisement with LifeTime %s \n", __FUNCTION__, __LINE__, ntohs(ra->nd_ra_router_lifetime))); while (opt_len > 0) { struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)opt_ptr; @@ -2920,30 +2748,33 @@ void receive_router_advert(int sockfd) { char addr_str[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &prefix_info->nd_opt_pi_prefix, addr_str, sizeof(addr_str)); - CcspTraceError(("%s %d: Default Route Prefix: %s/%d\n", __FUNCTION__, __LINE__, addr_str, prefix_info->nd_opt_pi_prefix_len)); + CcspTraceInfo(("%s %d: Default Route Prefix: %s/%d\n", __FUNCTION__, __LINE__, addr_str, prefix_info->nd_opt_pi_prefix_len)); } opt_len -= opt_hdr->nd_opt_len * 8; opt_ptr += opt_hdr->nd_opt_len * 8; } + ret = 0; } - + return ret; } -void WanManager_send_and_receive_rs_2() { +int WanManager_send_and_receive_rs(const char *if_name) +{ + int ret = -1; int sockfd; struct sockaddr_in6 dest_addr; - const char *if_name = "erouter0"; // Change this to your network interface - CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, if_name)); sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); if (sockfd < 0) { perror("socket"); - exit(EXIT_FAILURE); + CcspTraceError(("%s %d: sock creation failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); + return -1; } memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin6_family = AF_INET6; - inet_pton(AF_INET6, "ff02::2", &dest_addr.sin6_addr); + inet_pton(AF_INET6, "ff02::2", &dest_addr.sin6_addr); // Set destination address to all routers struct timeval tv; tv.tv_sec = TIMEOUT; @@ -2954,42 +2785,13 @@ void WanManager_send_and_receive_rs_2() { setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); setsockopt (sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); - CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); - if( send_router_solicit(sockfd, &dest_addr, if_name) == 0) + ret = send_router_solicit(sockfd, &dest_addr, if_name); + if (ret ==0) { - receive_router_advert(sockfd); - CcspTraceError(("%s %d: PARTHI \n", __FUNCTION__, __LINE__)); + ret = receive_router_advert(sockfd); } close(sockfd); - return 0; + return ret; } -#if 0 -void WanManager_send_and_receive_rs_3() -{ - int fd = socket (PF_INET6, SOCK_RAW, IPPROTO_ICMPV6); - - struct sockaddr_in6 tgt; - fcntl (fd, F_SETFD, FD_CLOEXEC); - - /* set ICMPv6 filter */ - { - struct icmp6_filter f; - - ICMP6_FILTER_SETBLOCKALL (&f); - ICMP6_FILTER_SETPASS (nd_type_advert, &f); - setsockopt (fd, IPPROTO_ICMPV6, ICMP6_FILTER, &f, sizeof (f)); - } - - setsockopt (fd, SOL_SOCKET, SO_DONTROUTE, &(int){ 1 }, sizeof (int)); - - /* sets Hop-by-hop limit to 255 */ - setsockopt (fd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &(int){ 1 }, sizeof (int)); - - setsockopt (fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); - setsockopt (fd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); - - -} -#endif diff --git a/source/WanManager/wanmgr_net_utils.h b/source/WanManager/wanmgr_net_utils.h index f73c09ac..b4301e3e 100644 --- a/source/WanManager/wanmgr_net_utils.h +++ b/source/WanManager/wanmgr_net_utils.h @@ -256,5 +256,5 @@ void WanManager_PrintBootEvents (WanBootEventState state); BOOL IsValidIpAddress(int32_t af, const char *address); -void WanManager_send_and_receive_rs(const char *interface); +int WanManager_send_and_receive_rs(const char *interface); #endif // _WANMGR_NET_UTILS_H_ diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 8e85723e..7f8506f1 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -1164,6 +1164,8 @@ static int do_toggle_v6_status (void) if (CheckV6DefaultRule(wanInterface) != TRUE) { + ret = WanManager_send_and_receive_rs(wanInterface); +#if 0 CcspTraceInfo(("%s %d toggle initiated\n", __FUNCTION__, __LINE__)); if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "1") != 0) @@ -1175,6 +1177,7 @@ static int do_toggle_v6_status (void) { CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); } +#endif } return ret; @@ -1191,8 +1194,6 @@ int Force_IPv6_toggle (char* wanInterface) int ret = 0; CcspTraceInfo(("%s %d force toggle initiated\n", __FUNCTION__, __LINE__)); - //WanManager_send_and_receive_rs(wanInterface); - WanManager_send_and_receive_rs_2(); /* if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "1") != 0) { @@ -1212,7 +1213,7 @@ int Force_IPv6_toggle (char* wanInterface) void wanmgr_Ipv6Toggle (void) { char v6Toggle[BUFLEN_128] = {0}; -#if 1//(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM +#if 0//(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM /*Ipv6 handled in PAM. No Toggle Needed. */ WanManager_send_and_receive_rs_2(); return; @@ -1262,7 +1263,8 @@ void WanMgr_Configure_accept_ra(DML_VIRTUAL_IFACE * pVirtIf, BOOL EnableRa) v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_defrtr=1",pVirtIf->Name); v_secure_system("sysctl -w net.ipv6.conf.all.forwarding=1"); CcspTraceInfo(("%s %d IPv6 toggle after ra accept \n", __FUNCTION__, __LINE__)); -#if !defined (_PLATFORM_RASPBERRYPI_) //REFPLTB-3054 + WanManager_send_and_receive_rs(pVirtIf->Name); +#if 0//!defined (_PLATFORM_RASPBERRYPI_) //REFPLTB-3054 Force_IPv6_toggle(pVirtIf->Name); // Do a IPv6 toggle to send Router Solicit #endif } From b8aea406f9b512d81fcf7b281760638e30f04de8 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 2 Aug 2024 12:45:19 +0000 Subject: [PATCH 08/64] Replace toggle funtion with send RS function Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 11 +---- source/WanManager/wanmgr_interface_sm.c | 31 ++++++--------- source/WanManager/wanmgr_net_utils.c | 27 ++++++++----- source/WanManager/wanmgr_sysevents.c | 53 +++---------------------- source/WanManager/wanmgr_sysevents.h | 2 +- 5 files changed, 38 insertions(+), 86 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 384b8381..f0dada8c 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1826,13 +1826,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) strcmp(Ipv6DataNew.nameserver1, pDhcp6cInfoCur->nameserver1)) { CcspTraceInfo(("IPv6 configuration has been changed \n")); - CcspTraceInfo(("IPv6 address new %s : cur %s \n",Ipv6DataNew.address , pDhcp6cInfoCur->address)); - CcspTraceInfo(("IPv6 pdIfAddress new %s : cur %s \n",Ipv6DataNew.pdIfAddress , pDhcp6cInfoCur->pdIfAddress)); - CcspTraceInfo(("IPv6 sitePrefix new %s : cur %s \n",Ipv6DataNew.sitePrefix , pDhcp6cInfoCur->sitePrefix)); - CcspTraceInfo(("IPv6 nameserver new %s : cur %s \n",Ipv6DataNew.nameserver, pDhcp6cInfoCur->nameserver)); - CcspTraceInfo(("IPv6 nameserver1 new %s : cur %s \n",Ipv6DataNew.nameserver1, pDhcp6cInfoCur->nameserver1)); pVirtIf->IP.Ipv6Changed = TRUE; - CcspTraceInfo(("%s %d - RestartConnectivityCheck triggered. \n", __FUNCTION__, __LINE__)); char param_name[256] = {0}; snprintf(param_name, sizeof(param_name), "Device.X_RDK_WanManager.Interface.%d.VirtualInterface.%d.IP.IPv6Address", pVirtIf->baseIfIdx+1, pVirtIf->VirIfIdx+1); @@ -1841,13 +1835,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) WanMgr_Rbus_EventPublishHandler(param_name, Ipv6DataNew.sitePrefix,RBUS_STRING); pVirtIf->IP.RestartConnectivityCheck = TRUE; + CcspTraceInfo(("%s %d - RestartConnectivityCheck triggered. \n", __FUNCTION__, __LINE__)); } else { /*TODO: Revisit this*/ //call function for changing the prlft and vallft // FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE : Handle Ip renew in handler thread. -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM_CBR2_PRODUCT_REQ_ +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM_ if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) { CcspTraceError(("Life Time Setting Failed")); @@ -1920,10 +1915,8 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) CcspTraceInfo(("%s %d Updating SYSEVENT_CURRENT_WAN_IFNAME %s\n", __FUNCTION__, __LINE__,pVirtIf->IP.Ipv6Data.ifname)); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_CURRENT_WAN_IFNAME, pVirtIf->IP.Ipv6Data.ifname, 0); -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: Review toggle for the devices using IANA /* Enable accept ra */ WanMgr_Configure_accept_ra(pVirtIf, TRUE); -#endif int index = strcspn(pVirtIf->IP.Ipv6Data.sitePrefix, "/"); if (index < strlen(pVirtIf->IP.Ipv6Data.sitePrefix)) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 56537dc8..f7b52530 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -391,7 +391,7 @@ static BOOL WanMgr_RestartFindExistingLink (WanMgr_IfaceSM_Controller_t* pWanIfa p_VirtIf->VLAN.Status = WAN_IFACE_LINKSTATUS_UP; ret = TRUE; /* If we are here. WanManager is restarted. Do a IPv6 toggle to avoid DAD. */ - WanManager_send_and_receive_rs(p_VirtIf->Name); + Force_IPv6_toggle(p_VirtIf->Name); } } @@ -1001,6 +1001,11 @@ static int checkIpv6LanAddressIsReadyToUse(char *ifname) } } + if(route_flag == 0) + { + WanManager_send_and_receive_rs(ifname); + } + if(dad_flag == 0 || route_flag == 0) { CcspTraceError(("%s %d dad_flag[%d] route_flag[%d] Failed \n", __FUNCTION__, __LINE__,dad_flag,route_flag)); return -1; @@ -3230,10 +3235,6 @@ static eWanState_t wan_state_obtaining_ip_addresses(WanMgr_IfaceSM_Controller_t* { return wan_transition_ipv6_up(pWanIfaceCtrl); } - else - { - wanmgr_Ipv6Toggle(); - } } else { @@ -3330,10 +3331,6 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) ret = wan_transition_ipv6_up(pWanIfaceCtrl); CcspTraceInfo((" %s %d - IPv6 Address Assigned to Bridge Yet.\n", __FUNCTION__, __LINE__)); } - else - { - wanmgr_Ipv6Toggle(); - } } if (p_VirtIf->IP.Ipv4Status == WAN_IFACE_IPV4_STATE_UP) { @@ -3455,10 +3452,6 @@ static eWanState_t wan_state_ipv4_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC { return wan_transition_ipv6_up(pWanIfaceCtrl); } - else - { - wanmgr_Ipv6Toggle(); - } } else if (p_VirtIf->IP.Ipv4Renewed == TRUE) { @@ -3569,7 +3562,7 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); - } //wanmgr_Ipv6Toggle() is called below. + } } else if (p_VirtIf->EnableMAPT == TRUE && pInterface->Selection.Status == WAN_IFACE_ACTIVE && @@ -3588,7 +3581,9 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , TRUE); p_VirtIf->IP.Ipv6Renewed = FALSE; } - wanmgr_Ipv6Toggle(); + + WanMgr_CheckDefaultRA(p_VirtIf->Name); + #if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) if(lanState == LAN_STATE_STOPPED) { @@ -3705,7 +3700,7 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); - }//wanmgr_Ipv6Toggle() is called below. + } } else if (p_VirtIf->EnableMAPT == TRUE && pInterface->Selection.Status == WAN_IFACE_ACTIVE && @@ -3732,8 +3727,8 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan // Start DHCP apps if not started WanMgr_MonitorDhcpApps(pWanIfaceCtrl); + WanMgr_CheckDefaultRA(p_VirtIf->Name); - wanmgr_Ipv6Toggle(); #if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) if(lanState == LAN_STATE_STOPPED) { @@ -3878,7 +3873,7 @@ static eWanState_t wan_state_mapt_active(WanMgr_IfaceSM_Controller_t* pWanIfaceC // Start DHCP apps if not started WanMgr_MonitorDhcpApps(pWanIfaceCtrl); - wanmgr_Ipv6Toggle(); + WanMgr_CheckDefaultRA(p_VirtIf->Name); #if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) if(lanState == LAN_STATE_STOPPED) { diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 423ce135..d18980e3 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -560,11 +560,6 @@ uint32_t WanManager_StartDhcpv6Client(DML_VIRTUAL_IFACE* pVirtIf, IFACE_TYPE Ifa CcspTraceInfo(("Enter WanManager_StartDhcpv6Client for %s \n", pVirtIf->Name)); -#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: ipv6 handled in PAM - //Enable accept_ra while starting dhcpv6 for comcast devices. - WanMgr_Configure_accept_ra(pVirtIf, TRUE); - usleep(500000); //sleep for 500 milli seconds -#endif pid = start_dhcpv6_client(¶ms); pVirtIf->IP.Dhcp6cPid = pid; @@ -2664,7 +2659,8 @@ struct in6_pktinfo { unsigned int ipi6_ifindex; }; -int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) { +int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) +{ struct icmp6_hdr rs_hdr; memset(&rs_hdr, 0, sizeof(rs_hdr)); rs_hdr.icmp6_type = ND_ROUTER_SOLICIT; @@ -2722,7 +2718,6 @@ int receive_router_advert(int sockfd) len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&src_addr, &addrlen); if (len < 0) { - perror("recvfrom"); CcspTraceError(("%s %d: recvfrom Failed %s \n", __FUNCTION__, __LINE__, strerror(errno))); return -1; } @@ -2732,10 +2727,14 @@ int receive_router_advert(int sockfd) if (hdr->icmp6_type == ND_ROUTER_ADVERT) { struct nd_router_advert *ra = (struct nd_router_advert *)buffer; + CcspTraceInfo(("%s %d: Received Router Advertisement with LifeTime %d \n", __FUNCTION__, __LINE__, ntohs(ra->nd_ra_router_lifetime))); + + /* TODO: Does default route parsing required ? to have complete control and Ipv6 RS and RA. + * Currently, WanManager sends and the RS and waits for RA, However, assigning default route is still handled by kernel. + * FIXME: Fix default route parsing. + unsigned char *opt_ptr = buffer + sizeof(struct nd_router_advert); ssize_t opt_len = len - sizeof(struct nd_router_advert); - - CcspTraceInfo(("%s %d: Received Router Advertisement with LifeTime %s \n", __FUNCTION__, __LINE__, ntohs(ra->nd_ra_router_lifetime))); while (opt_len > 0) { struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)opt_ptr; @@ -2753,8 +2752,15 @@ int receive_router_advert(int sockfd) opt_len -= opt_hdr->nd_opt_len * 8; opt_ptr += opt_hdr->nd_opt_len * 8; } + */ + ret = 0; } + + if(ret != 0) + { + CcspTraceError(("%s %d: Router Advertisement isn't received. \n", __FUNCTION__, __LINE__)); + } return ret; } @@ -2767,7 +2773,6 @@ int WanManager_send_and_receive_rs(const char *if_name) CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, if_name)); sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); if (sockfd < 0) { - perror("socket"); CcspTraceError(("%s %d: sock creation failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); return -1; } @@ -2786,7 +2791,7 @@ int WanManager_send_and_receive_rs(const char *if_name) setsockopt (sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); ret = send_router_solicit(sockfd, &dest_addr, if_name); - if (ret ==0) + if (ret == 0) { ret = receive_router_advert(sockfd); } diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 7f8506f1..cdbfdb63 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -1151,38 +1151,6 @@ static int CheckV6DefaultRule (char *wanInterface) return ret; } -static int do_toggle_v6_status (void) -{ - int ret = 0; - -#ifdef FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE - char wanInterface[BUFLEN_64] = {'\0'}; - wanmgr_get_wan_interface(wanInterface); -#else - char *wanInterface = "erouter0"; -#endif - - if (CheckV6DefaultRule(wanInterface) != TRUE) - { - ret = WanManager_send_and_receive_rs(wanInterface); -#if 0 - CcspTraceInfo(("%s %d toggle initiated\n", __FUNCTION__, __LINE__)); - - if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "1") != 0) - { - CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); - } - - if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "0") != 0) - { - CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); - } -#endif - } - - return ret; -} - /* * @brief Utility function used to toggle ipv6 triggered from ISM. * This function will not check existing default route. @@ -1194,7 +1162,6 @@ int Force_IPv6_toggle (char* wanInterface) int ret = 0; CcspTraceInfo(("%s %d force toggle initiated\n", __FUNCTION__, __LINE__)); -/* if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "1") != 0) { CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); @@ -1204,33 +1171,27 @@ int Force_IPv6_toggle (char* wanInterface) { CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); } -*/ + sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); //Reset toggle flag to false. return ret; } -void wanmgr_Ipv6Toggle (void) +void WanMgr_CheckDefaultRA (const char* wanInterface) { char v6Toggle[BUFLEN_128] = {0}; -#if 0//(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) && !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)//TODO: V6 handled in PAM - /*Ipv6 handled in PAM. No Toggle Needed. */ - WanManager_send_and_receive_rs_2(); - return; -#else - + //TODO : Move router monitor to a WanManager thread ? to avoid continous sysevent get sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, v6Toggle, sizeof(v6Toggle)); if((strlen(v6Toggle) == 0) || (!strcmp(v6Toggle,"TRUE"))) { CcspTraceInfo(("%s %d SYSEVENT_IPV6_TOGGLE[TRUE] \n", __FUNCTION__, __LINE__)); - if(do_toggle_v6_status() ==0) + if (CheckV6DefaultRule(wanInterface) == TRUE || WanManager_send_and_receive_rs(wanInterface) == 0) { sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); } } -#endif } /* @@ -1262,11 +1223,9 @@ void WanMgr_Configure_accept_ra(DML_VIRTUAL_IFACE * pVirtIf, BOOL EnableRa) v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_pinfo=0",pVirtIf->Name); v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_defrtr=1",pVirtIf->Name); v_secure_system("sysctl -w net.ipv6.conf.all.forwarding=1"); - CcspTraceInfo(("%s %d IPv6 toggle after ra accept \n", __FUNCTION__, __LINE__)); + + CcspTraceInfo(("%s %d Send Router Solicit after enabling ra accept \n", __FUNCTION__, __LINE__)); WanManager_send_and_receive_rs(pVirtIf->Name); -#if 0//!defined (_PLATFORM_RASPBERRYPI_) //REFPLTB-3054 - Force_IPv6_toggle(pVirtIf->Name); // Do a IPv6 toggle to send Router Solicit -#endif } else { diff --git a/source/WanManager/wanmgr_sysevents.h b/source/WanManager/wanmgr_sysevents.h index ea894a05..5489a87a 100644 --- a/source/WanManager/wanmgr_sysevents.h +++ b/source/WanManager/wanmgr_sysevents.h @@ -295,7 +295,7 @@ INT wanmgr_isWanStandby(); * @brief Utility function used to toggle ipv6 based on sysevent from netmonitor. * @return Returns NONE. */ -void wanmgr_Ipv6Toggle(); +void WanMgr_CheckDefaultRA(const char* wanInterface); /* * @brief Utility function used to toggle ipv6 triggered from ISM. From 1e13651f7f81241e7fb6413cec2c303cd89fec08 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Wed, 7 Aug 2024 11:44:29 +0000 Subject: [PATCH 09/64] Adding variables to store the default route value. Signed-off-by: S-Parthiban-Selvaraj --- source/TR-181/include/wanmgr_dml.h | 2 ++ source/WanManager/wanmgr_interface_sm.c | 30 +++++++++--------- source/WanManager/wanmgr_net_utils.c | 42 ++++++------------------- source/WanManager/wanmgr_net_utils.h | 2 +- source/WanManager/wanmgr_sysevents.c | 13 ++++---- source/WanManager/wanmgr_sysevents.h | 2 +- 6 files changed, 35 insertions(+), 56 deletions(-) diff --git a/source/TR-181/include/wanmgr_dml.h b/source/TR-181/include/wanmgr_dml.h index 14144271..5c7b560d 100644 --- a/source/TR-181/include/wanmgr_dml.h +++ b/source/TR-181/include/wanmgr_dml.h @@ -329,6 +329,8 @@ typedef struct _WANMGR_IPV6_DATA uint32_t prefixPltime; uint32_t prefixVltime; char sitePrefixOld[BUFLEN_48]; /**< add support for RFC7084 requirement L-13 */ + char defaultRoute[INET6_ADDRSTRLEN]; /**< add support for RFC7084 requirement L-13 */ + uint32_t defRouteLifeTime; #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* Params to store the IPv6 IPC message */ bool addrAssigned; diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index f7b52530..ecb5d929 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -185,13 +185,13 @@ static ANSC_STATUS WanManager_ClearDHCPData(DML_VIRTUAL_IFACE * pVirtIf); * lan ipv6 address ready to use. * @return RETURN_OK on success else RETURN_ERR *************************************************************************************/ -static int checkIpv6AddressAssignedToBridge(char *IfaceName); +static int checkIpv6AddressAssignedToBridge(DML_VIRTUAL_IFACE* p_VirtIf); /************************************************************************************* * @brief Check IPv6 address is ready to use or not * @return RETURN_OK on success else RETURN_ERR *************************************************************************************/ -static int checkIpv6LanAddressIsReadyToUse(char *IfaceName); +static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf); #ifdef FEATURE_MAPT @@ -901,7 +901,7 @@ int wan_updateDNS(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl, BOOL addIPv4, BOOL return ret; } -static int checkIpv6LanAddressIsReadyToUse(char *ifname) +static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) { char buffer[BUFLEN_256] = {0}; FILE *fp_dad = NULL; @@ -962,7 +962,7 @@ static int checkIpv6LanAddressIsReadyToUse(char *ifname) if (BridgeMode != 0) { memset(IfaceName, 0, sizeof(IfaceName)); - strncpy(IfaceName, ifname, sizeof(IfaceName)-1); + strncpy(IfaceName, p_VirtIf->Name, sizeof(IfaceName)-1); } CcspTraceInfo(("%s-%d: IfaceName=%s, BridgeMode=%d \n", __FUNCTION__, __LINE__, IfaceName, BridgeMode)); @@ -1003,7 +1003,7 @@ static int checkIpv6LanAddressIsReadyToUse(char *ifname) if(route_flag == 0) { - WanManager_send_and_receive_rs(ifname); + WanManager_send_and_receive_rs(p_VirtIf->Name); } if(dad_flag == 0 || route_flag == 0) { @@ -1014,7 +1014,7 @@ static int checkIpv6LanAddressIsReadyToUse(char *ifname) return 0; } -static int checkIpv6AddressAssignedToBridge(char *IfaceName) +static int checkIpv6AddressAssignedToBridge(DML_VIRTUAL_IFACE* p_VirtIf) { char lanPrefix[BUFLEN_128] = {0}; int ret = RETURN_ERR; @@ -1024,7 +1024,7 @@ static int checkIpv6AddressAssignedToBridge(char *IfaceName) if(strlen(lanPrefix) > 0) { CcspTraceInfo(("%s %d lanPrefix[%s] \n", __FUNCTION__, __LINE__,lanPrefix)); - if (checkIpv6LanAddressIsReadyToUse(IfaceName) == 0) + if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == 0) { ret = RETURN_OK; } @@ -3231,7 +3231,7 @@ static eWanState_t wan_state_obtaining_ip_addresses(WanMgr_IfaceSM_Controller_t* p_VirtIf->IP.Ipv6Changed = FALSE; return WAN_STATE_OBTAINING_IP_ADDRESSES; } - if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) + if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) { return wan_transition_ipv6_up(pWanIfaceCtrl); } @@ -3326,7 +3326,7 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) } p_VirtIf->IP.Ipv6Changed == FALSE; } - if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) + if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) { ret = wan_transition_ipv6_up(pWanIfaceCtrl); CcspTraceInfo((" %s %d - IPv6 Address Assigned to Bridge Yet.\n", __FUNCTION__, __LINE__)); @@ -3448,7 +3448,7 @@ static eWanState_t wan_state_ipv4_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC p_VirtIf->IP.Ipv6Changed = FALSE; return WAN_STATE_IPV4_LEASED; } - if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) + if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) { return wan_transition_ipv6_up(pWanIfaceCtrl); } @@ -3559,7 +3559,7 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC pInterface->Selection.Status == WAN_IFACE_ACTIVE && p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) { - if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) // Wait for default gateway before MAP-T configuration + if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); } @@ -3582,7 +3582,7 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC p_VirtIf->IP.Ipv6Renewed = FALSE; } - WanMgr_CheckDefaultRA(p_VirtIf->Name); + WanMgr_CheckDefaultRA(p_VirtIf); #if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) if(lanState == LAN_STATE_STOPPED) @@ -3697,7 +3697,7 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan pInterface->Selection.Status == WAN_IFACE_ACTIVE && p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) { - if (checkIpv6AddressAssignedToBridge(p_VirtIf->Name) == RETURN_OK) // Wait for default gateway before MAP-T configuration + if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); } @@ -3727,7 +3727,7 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan // Start DHCP apps if not started WanMgr_MonitorDhcpApps(pWanIfaceCtrl); - WanMgr_CheckDefaultRA(p_VirtIf->Name); + WanMgr_CheckDefaultRA(p_VirtIf); #if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) if(lanState == LAN_STATE_STOPPED) @@ -3873,7 +3873,7 @@ static eWanState_t wan_state_mapt_active(WanMgr_IfaceSM_Controller_t* pWanIfaceC // Start DHCP apps if not started WanMgr_MonitorDhcpApps(pWanIfaceCtrl); - WanMgr_CheckDefaultRA(p_VirtIf->Name); + WanMgr_CheckDefaultRA(p_VirtIf); #if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) if(lanState == LAN_STATE_STOPPED) { diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index d18980e3..d593472d 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -2659,7 +2659,7 @@ struct in6_pktinfo { unsigned int ipi6_ifindex; }; -int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) +static int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) { struct icmp6_hdr rs_hdr; memset(&rs_hdr, 0, sizeof(rs_hdr)); @@ -2707,7 +2707,7 @@ int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char * return 0; } -int receive_router_advert(int sockfd) +static int receive_router_advert(int sockfd, DML_VIRTUAL_IFACE * p_VirtIf) { int ret = -1; char buffer[RA_MSG_SIZE]; @@ -2727,33 +2727,9 @@ int receive_router_advert(int sockfd) if (hdr->icmp6_type == ND_ROUTER_ADVERT) { struct nd_router_advert *ra = (struct nd_router_advert *)buffer; - CcspTraceInfo(("%s %d: Received Router Advertisement with LifeTime %d \n", __FUNCTION__, __LINE__, ntohs(ra->nd_ra_router_lifetime))); - - /* TODO: Does default route parsing required ? to have complete control and Ipv6 RS and RA. - * Currently, WanManager sends and the RS and waits for RA, However, assigning default route is still handled by kernel. - * FIXME: Fix default route parsing. - - unsigned char *opt_ptr = buffer + sizeof(struct nd_router_advert); - ssize_t opt_len = len - sizeof(struct nd_router_advert); - while (opt_len > 0) - { - struct nd_opt_hdr *opt_hdr = (struct nd_opt_hdr *)opt_ptr; - - CcspTraceError(("%s %d: Option %d\n", __FUNCTION__, __LINE__, opt_hdr->nd_opt_type)); - CcspTraceError(("%s %d: Option len %d\n", __FUNCTION__, __LINE__, opt_hdr->nd_opt_len)); - if (opt_hdr->nd_opt_type == ND_OPT_PREFIX_INFORMATION) - { - struct nd_opt_prefix_info *prefix_info = (struct nd_opt_prefix_info *)opt_ptr; - char addr_str[INET6_ADDRSTRLEN]; - - inet_ntop(AF_INET6, &prefix_info->nd_opt_pi_prefix, addr_str, sizeof(addr_str)); - CcspTraceInfo(("%s %d: Default Route Prefix: %s/%d\n", __FUNCTION__, __LINE__, addr_str, prefix_info->nd_opt_pi_prefix_len)); - } - opt_len -= opt_hdr->nd_opt_len * 8; - opt_ptr += opt_hdr->nd_opt_len * 8; - } - */ - + inet_ntop (AF_INET6, &src_addr.sin6_addr, p_VirtIf->IP.Ipv6Data.defaultRoute, sizeof (p_VirtIf->IP.Ipv6Data.defaultRoute)); + p_VirtIf->IP.Ipv6Data.defRouteLifeTime = ntohs(ra->nd_ra_router_lifetime); + CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %s\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Data.defaultRoute, p_VirtIf->IP.Ipv6Data.defRouteLifeTime)); ret = 0; } @@ -2764,13 +2740,13 @@ int receive_router_advert(int sockfd) return ret; } -int WanManager_send_and_receive_rs(const char *if_name) +int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * pVirtIf) { int ret = -1; int sockfd; struct sockaddr_in6 dest_addr; - CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, if_name)); + CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, pVirtIf->Name)); sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); if (sockfd < 0) { CcspTraceError(("%s %d: sock creation failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); @@ -2790,10 +2766,10 @@ int WanManager_send_and_receive_rs(const char *if_name) setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); setsockopt (sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); - ret = send_router_solicit(sockfd, &dest_addr, if_name); + ret = send_router_solicit(sockfd, &dest_addr, pVirtIf->Name); if (ret == 0) { - ret = receive_router_advert(sockfd); + ret = receive_router_advert(sockfd, pVirtIf); } close(sockfd); diff --git a/source/WanManager/wanmgr_net_utils.h b/source/WanManager/wanmgr_net_utils.h index b4301e3e..0ae5bc07 100644 --- a/source/WanManager/wanmgr_net_utils.h +++ b/source/WanManager/wanmgr_net_utils.h @@ -256,5 +256,5 @@ void WanManager_PrintBootEvents (WanBootEventState state); BOOL IsValidIpAddress(int32_t af, const char *address); -int WanManager_send_and_receive_rs(const char *interface); +int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * pVirtIf); #endif // _WANMGR_NET_UTILS_H_ diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index cdbfdb63..2906bb7c 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -1177,7 +1177,7 @@ int Force_IPv6_toggle (char* wanInterface) return ret; } -void WanMgr_CheckDefaultRA (const char* wanInterface) +void WanMgr_CheckDefaultRA (DML_VIRTUAL_IFACE * pVirtIf) { char v6Toggle[BUFLEN_128] = {0}; //TODO : Move router monitor to a WanManager thread ? to avoid continous sysevent get @@ -1187,7 +1187,7 @@ void WanMgr_CheckDefaultRA (const char* wanInterface) { CcspTraceInfo(("%s %d SYSEVENT_IPV6_TOGGLE[TRUE] \n", __FUNCTION__, __LINE__)); - if (CheckV6DefaultRule(wanInterface) == TRUE || WanManager_send_and_receive_rs(wanInterface) == 0) + if (CheckV6DefaultRule(pVirtIf->Name) == TRUE || WanManager_send_and_receive_rs(pVirtIf) == 0) { sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); } @@ -1211,12 +1211,13 @@ void WanMgr_Configure_accept_ra(DML_VIRTUAL_IFACE * pVirtIf, BOOL EnableRa) return; } + v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=2",pVirtIf->Name); CcspTraceInfo(("%s %d %s accept_ra for interface %s\n", __FUNCTION__, __LINE__,EnableRa?"Enabling":"Disabling", pVirtIf->Name)); if(EnableRa) { - v_secure_system("sysctl -w net.ipv6.conf.%s.router_solicitations=3",pVirtIf->Name); - v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=2",pVirtIf->Name); +// v_secure_system("sysctl -w net.ipv6.conf.%s.router_solicitations=3",pVirtIf->Name); +// v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=2",pVirtIf->Name); CcspTraceInfo(("%s %d Enabling forwarding for interface %s\n", __FUNCTION__, __LINE__,pVirtIf->Name)); v_secure_system("sysctl -w net.ipv6.conf.%s.forwarding=1",pVirtIf->Name); @@ -1225,12 +1226,12 @@ void WanMgr_Configure_accept_ra(DML_VIRTUAL_IFACE * pVirtIf, BOOL EnableRa) v_secure_system("sysctl -w net.ipv6.conf.all.forwarding=1"); CcspTraceInfo(("%s %d Send Router Solicit after enabling ra accept \n", __FUNCTION__, __LINE__)); - WanManager_send_and_receive_rs(pVirtIf->Name); + WanManager_send_and_receive_rs(pVirtIf); } else { v_secure_system("sysctl -w net.ipv6.conf.%s.router_solicitations=0",pVirtIf->Name); - v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=0",pVirtIf->Name); + v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_defrtr=0",pVirtIf->Name); } } diff --git a/source/WanManager/wanmgr_sysevents.h b/source/WanManager/wanmgr_sysevents.h index 5489a87a..0e856c52 100644 --- a/source/WanManager/wanmgr_sysevents.h +++ b/source/WanManager/wanmgr_sysevents.h @@ -295,7 +295,7 @@ INT wanmgr_isWanStandby(); * @brief Utility function used to toggle ipv6 based on sysevent from netmonitor. * @return Returns NONE. */ -void WanMgr_CheckDefaultRA(const char* wanInterface); +void WanMgr_CheckDefaultRA(DML_VIRTUAL_IFACE * pVirtIf); /* * @brief Utility function used to toggle ipv6 triggered from ISM. From 0e0ba2dab8ab6b5560fcfcc7fec0d8b511039e53 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Thu, 8 Aug 2024 11:20:31 +0000 Subject: [PATCH 10/64] Fix ipv6 toggle calling Signed-off-by: Parthiban Selvaraj --- .../wanmgr_rbus_handler_apis.c | 22 +--------------- source/WanManager/wanmgr_interface_sm.c | 18 +++++++------ source/WanManager/wanmgr_net_utils.c | 25 ++++++++++++++----- source/WanManager/wanmgr_sysevents.c | 19 ++++++-------- 4 files changed, 37 insertions(+), 47 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c index 69ebb700..03fd1955 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c @@ -1883,7 +1883,7 @@ ANSC_STATUS WanMgr_Configure_TAD_WCC(DML_VIRTUAL_IFACE *p_VirtIf, WCC_EVENT Eve snprintf(pTADEvent->IPv4_DNS_Servers, sizeof(pTADEvent->IPv4_DNS_Servers), "%s,%s",p_VirtIf->IP.Ipv4Data.dnsServer,p_VirtIf->IP.Ipv4Data.dnsServer1); snprintf(pTADEvent->IPv4_Gateway, sizeof(pTADEvent->IPv4_Gateway), "%s",p_VirtIf->IP.Ipv4Data.gateway); snprintf(pTADEvent->IPv6_DNS_Servers, sizeof(pTADEvent->IPv6_DNS_Servers), "%s,%s",p_VirtIf->IP.Ipv6Data.nameserver,p_VirtIf->IP.Ipv6Data.nameserver1); - //TODO: Add Ipv6 gateway address after integrating with DHCP manager. Currently, wanmanager doesn't have information of IPv6 gateway address + snprintf(pTADEvent->IPv6_Gateway, sizeof(pTADEvent->IPv6_Gateway), "%s",p_VirtIf->IP.Ipv6Data.defaultRoute,p_VirtIf->IP.Ipv6Data.defaultRoute); pTADEvent->Event = Event; //Run in thread to avoid mutex deadlock between WanManager and rbus handle @@ -1954,26 +1954,6 @@ void *WanMgr_Configure_WCC_Thread(void *arg) snprintf(pTADEvent->IPv6_DNS_Servers, sizeof(pTADEvent->IPv6_DNS_Servers), "%s,", strtok(MeshWANInterfaceUla, "/")); snprintf(pTADEvent->IPv6_Gateway, sizeof(pTADEvent->IPv6_Gateway), "%s", strtok(MeshWANInterfaceUla, "/")); } - else //TODO: Workaround to fetch Ipv6 gateway address from the routing table. This should be removed after integrating DHCPmanager - { - FILE *fp_route; - char command[BUFLEN_256] = {0}; - char buffer[BUFLEN_256] ={0}; - snprintf(command, sizeof(command), "ip -6 route show default | grep %s | awk '{print $3}'", pTADEvent->IfaceName); - fp_route = popen(command, "r"); - if(fp_route != NULL) - { - if (fgets(buffer, BUFLEN_256, fp_route) != NULL) - { - char *token = strtok(buffer, "\n"); // get string up until newline character - if (token) - { - strncpy(pTADEvent->IPv6_Gateway, token, sizeof(pTADEvent->IPv6_Gateway)-1); - } - } - pclose(fp_route); - } - } // set IPv6 nameserver list CcspTraceInfo(("%s %d: IPv6_DNS_Servers %s \n", __FUNCTION__, __LINE__, pTADEvent->IPv6_DNS_Servers)); diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index ecb5d929..9f7af110 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -993,17 +993,19 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) } } - if(dad_flag == 0 || route_flag == 0) { + if(dad_flag == 0 || route_flag == 0) + { + if(route_flag == 0) + { + //If the default route is not present, Send a router solicit. + WanManager_send_and_receive_rs(p_VirtIf); + } sleep(1); } - else { + else + { break; - } - } - - if(route_flag == 0) - { - WanManager_send_and_receive_rs(p_VirtIf->Name); + } } if(dad_flag == 0 || route_flag == 0) { diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index d593472d..800be9e7 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -559,7 +559,7 @@ uint32_t WanManager_StartDhcpv6Client(DML_VIRTUAL_IFACE* pVirtIf, IFACE_TYPE Ifa params.ifType = IfaceType; CcspTraceInfo(("Enter WanManager_StartDhcpv6Client for %s \n", pVirtIf->Name)); - + WanManager_send_and_receive_rs(pVirtIf); pid = start_dhcpv6_client(¶ms); pVirtIf->IP.Dhcp6cPid = pid; @@ -2651,7 +2651,7 @@ ANSC_STATUS WanManager_get_interface_mac(char *interfaceName, char* macAddress, } //Send and receive RS -#define TIMEOUT 2 +#define RS_RA_TIMEOUT 2 #define RS_MSG_SIZE 8 #define RA_MSG_SIZE 1024 struct in6_pktinfo { @@ -2729,7 +2729,7 @@ static int receive_router_advert(int sockfd, DML_VIRTUAL_IFACE * p_VirtIf) struct nd_router_advert *ra = (struct nd_router_advert *)buffer; inet_ntop (AF_INET6, &src_addr.sin6_addr, p_VirtIf->IP.Ipv6Data.defaultRoute, sizeof (p_VirtIf->IP.Ipv6Data.defaultRoute)); p_VirtIf->IP.Ipv6Data.defRouteLifeTime = ntohs(ra->nd_ra_router_lifetime); - CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %s\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Data.defaultRoute, p_VirtIf->IP.Ipv6Data.defRouteLifeTime)); + CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %d\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Data.defaultRoute, p_VirtIf->IP.Ipv6Data.defRouteLifeTime)); ret = 0; } @@ -2745,6 +2745,7 @@ int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * pVirtIf) int ret = -1; int sockfd; struct sockaddr_in6 dest_addr; + int retry = 3; //default retry CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, pVirtIf->Name)); sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); @@ -2758,7 +2759,7 @@ int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * pVirtIf) inet_pton(AF_INET6, "ff02::2", &dest_addr.sin6_addr); // Set destination address to all routers struct timeval tv; - tv.tv_sec = TIMEOUT; + tv.tv_sec = RS_RA_TIMEOUT; tv.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); setsockopt (sockfd, SOL_SOCKET, SO_DONTROUTE, &(int){1}, sizeof (int)); @@ -2766,10 +2767,22 @@ int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * pVirtIf) setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); setsockopt (sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); - ret = send_router_solicit(sockfd, &dest_addr, pVirtIf->Name); - if (ret == 0) + while(retry > 0) { + retry--; + ret = send_router_solicit(sockfd, &dest_addr, pVirtIf->Name); + if (ret != 0) + { + CcspTraceError(("%s %d: Router Solicit send failed. Retry %d \n", __FUNCTION__, __LINE__, retry)); + continue; + } + ret = receive_router_advert(sockfd, pVirtIf); + if(ret == 0) + { + break; + } + CcspTraceError(("%s %d: Router Advertisement Retry %d \n", __FUNCTION__, __LINE__, retry)); } close(sockfd); diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 2906bb7c..8836fd7f 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -1195,7 +1195,7 @@ void WanMgr_CheckDefaultRA (DML_VIRTUAL_IFACE * pVirtIf) } /* - * @brief Utility function used to Configure accept_ra from ISM. + * @brief Utility function used to Configure accept_ra_defrtr from ISM. * @param : Virtual Interface and Enable. * @return Returns NONE. */ @@ -1211,29 +1211,24 @@ void WanMgr_Configure_accept_ra(DML_VIRTUAL_IFACE * pVirtIf, BOOL EnableRa) return; } - v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=2",pVirtIf->Name); CcspTraceInfo(("%s %d %s accept_ra for interface %s\n", __FUNCTION__, __LINE__,EnableRa?"Enabling":"Disabling", pVirtIf->Name)); - + //Enable accept_ra to allow receiving RA all the time. This funtion only blocks learning defult route from RA. + v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=2",pVirtIf->Name); if(EnableRa) { -// v_secure_system("sysctl -w net.ipv6.conf.%s.router_solicitations=3",pVirtIf->Name); -// v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra=2",pVirtIf->Name); - - CcspTraceInfo(("%s %d Enabling forwarding for interface %s\n", __FUNCTION__, __LINE__,pVirtIf->Name)); + v_secure_system("sysctl -w net.ipv6.conf.%s.router_solicitations=3",pVirtIf->Name); v_secure_system("sysctl -w net.ipv6.conf.%s.forwarding=1",pVirtIf->Name); v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_pinfo=0",pVirtIf->Name); - v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_defrtr=1",pVirtIf->Name); + v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_defrtr=1",pVirtIf->Name); //Learn defult route from the RA. v_secure_system("sysctl -w net.ipv6.conf.all.forwarding=1"); - - CcspTraceInfo(("%s %d Send Router Solicit after enabling ra accept \n", __FUNCTION__, __LINE__)); - WanManager_send_and_receive_rs(pVirtIf); + CcspTraceInfo(("%s %d Enabling forwarding for interface %s\n", __FUNCTION__, __LINE__,pVirtIf->Name)); } else { + //Only accept_ra_defrtr set to false to block setting default route. v_secure_system("sysctl -w net.ipv6.conf.%s.router_solicitations=0",pVirtIf->Name); v_secure_system("sysctl -w net.ipv6.conf.%s.accept_ra_defrtr=0",pVirtIf->Name); } - } static int getVendorClassInfo(char *buffer, int length) From f0bd16d1999d09c6105c6f2d76732545afa5fe33 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Mon, 12 Aug 2024 12:59:54 +0000 Subject: [PATCH 11/64] Fixing lan prefix sysvent and LAN_MANAGER build flag Signed-off-by: S-Parthiban-Selvaraj --- .../middle_layer_src/wanmgr_rdkbus_apis.c | 17 ------- source/WanManager/wanmgr_dhcpv6_apis.c | 19 +------ source/WanManager/wanmgr_interface_sm.c | 51 +++++-------------- 3 files changed, 14 insertions(+), 73 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c index 4660fa9b..a3bb0df0 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c @@ -275,14 +275,6 @@ int get_Virtual_Interface_FromPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU pVirtIf->Enable = TRUE; } -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) /* TODO: This is a workaround for the platforms using same Wan Name.*/ - _ansc_memset(param_name, 0, sizeof(param_name)); - _ansc_memset(param_value, 0, sizeof(param_value)); - _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, instancenum, (virtInsNum + 1)); - retPsmGet = WanMgr_RdkBus_GetParamValuesFromDB(param_name,param_value,sizeof(param_value)); - AnscCopyString(pVirtIf->Name, param_value); -#endif - _ansc_memset(param_name, 0, sizeof(param_name)); _ansc_memset(param_value, 0, sizeof(param_value)); _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_ALIAS, instancenum, (virtInsNum + 1)); @@ -533,15 +525,6 @@ int write_Virtual_Interface_ToPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_ENABLE, instancenum, (virtInsNum + 1)); WanMgr_RdkBus_SetParamValuesToDB(param_name,param_value); -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) && !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) - /* TODO: Build flag check is a workaround for the platforms using same Wan Name. */ - memset(param_value, 0, sizeof(param_value)); - memset(param_name, 0, sizeof(param_name)); - AnscCopyString(param_value, pVirtIf->Name); - _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, instancenum, (virtInsNum + 1)); - WanMgr_RdkBus_SetParamValuesToDB(param_name,param_value); -#endif - memset(param_value, 0, sizeof(param_value)); memset(param_name, 0, sizeof(param_name)); AnscCopyString(param_value, pVirtIf->Alias); diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index f0dada8c..ae20488d 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1841,14 +1841,11 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { /*TODO: Revisit this*/ //call function for changing the prlft and vallft - // FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE : Handle Ip renew in handler thread. -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM_ if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) { CcspTraceError(("Life Time Setting Failed")); } sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); -#endif pVirtIf->IP.Ipv6Renewed = TRUE; } // update current IPv6 Data @@ -2000,21 +1997,6 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) #endif //Restart LAN if required. BOOL bRestartLan = FALSE; - /* we need save this for zebra to send RA - ipv6_prefix // xx:xx::/yy - */ - memset(cmdLine, 0, sizeof(cmdLine)); -#ifndef _HUB4_PRODUCT_REQ_ - snprintf(cmdLine, sizeof(cmdLine), "sysevent set ipv6_prefix %s ", pVirtIf->IP.Ipv6Data.sitePrefix); -#else -#ifdef LAN_MGR_SUPPORT - snprintf(cmdLine, sizeof(cmdLine), "sysevent set dhcpv6_raserver-restart "); -#else - snprintf(cmdLine, sizeof(cmdLine), "sysevent set zebra-restart "); -#endif -#endif - if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) - CcspTraceError(("failed to run cmd: %s", cmdLine)); CcspTraceWarning(("%s: globalIP %s PreviousIPv6Address %s\n", __func__, globalIP, PreviousIPv6Address)); @@ -2095,6 +2077,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIXPLTIME, set_value, 0); syscfg_set_string(SYSCFG_FIELD_PREVIOUS_IPV6_PREFIX, pVirtIf->IP.Ipv6Data.sitePrefixOld); syscfg_set_string(SYSCFG_FIELD_IPV6_PREFIX, pVirtIf->IP.Ipv6Data.sitePrefix); + syscfg_set_string("lan_prefix", pVirtIf->IP.Ipv6Data.sitePrefix); // create global IPv6 address (::1) char prefix[BUFLEN_64] = {0}; memset(prefix, 0, sizeof(prefix)); diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 9f7af110..e499d345 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -913,38 +913,6 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) char IfaceName[BUFLEN_16] = {0}; int BridgeMode = 0; -#if defined (_HUB4_PRODUCT_REQ_) //TODO: Need a generic way to check ipv6 prefix and Address. - int address_flag = 0; - struct ifaddrs *ifap = NULL; - struct ifaddrs *ifa = NULL; - char addr[INET6_ADDRSTRLEN] = {0}; - - /* We need to check the interface has got an IPV6-prefix , beacuse P-and-M can send - the same event when interface is down, so we ensure send the UP event only - when interface has an IPV6-prefix. - */ - if (!getifaddrs(&ifap)) { - for (ifa = ifap; ifa; ifa = ifa->ifa_next) { - if(strncmp(ifa->ifa_name,ETH_BRIDGE_NAME, strlen(ETH_BRIDGE_NAME))) - continue; - if (ifa->ifa_addr->sa_family != AF_INET6) - continue; - getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), addr, - sizeof(addr), NULL, 0, NI_NUMERICHOST); - if((strncmp(addr + (strlen(addr) - 3), "::1", 3) == 0)){ - address_flag = 1; - break; - } - }//for loop - freeifaddrs(ifap); - }//getifaddr close - - if(address_flag == 0) { - CcspTraceError(("%s %d address_flag Failed\n", __FUNCTION__, __LINE__)); - return -1; - } -#endif - /* Check Duplicate Address Detection (DAD) status. The way it works is that after an address is added to an interface, the operating system uses the Neighbor Discovery Protocol to check if any other host on the network @@ -1342,6 +1310,12 @@ static int wan_setUpIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_CONNECTION_STATE, WAN_STATUS_UP, 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); +#ifdef LAN_MGR_SUPPORT + sysevent_set(sysevent_fd, sysevent_token, "dhcpv6_raserver-restart", NULL, 0); +#else + //FIXME: does zebra-restart necessory after RADVD_RESTART + sysevent_set(sysevent_fd, sysevent_token, "zebra-restart", NULL, 0); +#endif sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_DHCP_SERVER_RESTART, NULL, 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_WAN_STATUS, buf, sizeof(buf)); @@ -1751,10 +1725,11 @@ static eWanState_t wan_transition_start(WanMgr_IfaceSM_Controller_t* pWanIfaceCt CcspTraceInfo(("%s %d - Already WAN interface %s created\n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } -#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) if(pInterface->IfaceType != REMOTE_IFACE) { - /* TODO: This is a workaround for the platforms using same Wan Name.*/ + /* TODO: This is not a right place to read the WanName from persistance memory. + * Since many platforms still use same name for all Wan Interfaces, we are updating here to make sure only the interface which is running VISM has the interface name. + */ char param_value[256] ={0}; char param_name[512] ={0}; int retPsmGet = CCSP_SUCCESS; @@ -1763,7 +1738,7 @@ static eWanState_t wan_transition_start(WanMgr_IfaceSM_Controller_t* pWanIfaceCt AnscCopyString(p_VirtIf->Name, (retPsmGet == CCSP_SUCCESS && (strlen(param_value) > 0 )) ? param_value: "erouter0"); CcspTraceInfo(("%s %d VIRIF_NAME is copied from PSM. %s\n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } -#endif + /*TODO: VLAN should not be set for Remote Interface, for More info, refer RDKB-42676*/ if( p_VirtIf->VLAN.Enable == TRUE && p_VirtIf->VLAN.Status == WAN_IFACE_LINKSTATUS_DOWN && pInterface->IfaceType != REMOTE_IFACE) { @@ -2823,14 +2798,14 @@ static eWanState_t wan_transition_exit(WanMgr_IfaceSM_Controller_t* pWanIfaceCtr Update_Interface_Status(); CcspTraceInfo(("%s %d - Interface '%s' - EXITING STATE MACHINE\n", __FUNCTION__, __LINE__, pInterface->Name)); -#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) - /* TODO:This is a workaround for the platforms using same Wan Name.*/ + /* TODO: This is not a right place to clear the WanName. + * Since many platforms still use same name for all Wan Interfaces, we are clearing here to make sure only the interface which is running VISM has the interface name. + */ if(pInterface->IfaceType != REMOTE_IFACE) { memset(p_VirtIf->Name, 0, sizeof(p_VirtIf->Name)); CcspTraceInfo(("%s %d clear VIRIF_NAME \n", __FUNCTION__, __LINE__)); } -#endif p_VirtIf->Interface_SM_Running = FALSE; From f45f83c98baa7c0cf3803d91c5e2fd2f0b1e051b Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Tue, 13 Aug 2024 13:45:55 +0000 Subject: [PATCH 12/64] Fix for LAN manager stateful server restart Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 90 ++++++++++--------------- source/WanManager/wanmgr_interface_sm.c | 6 -- 2 files changed, 35 insertions(+), 61 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index ae20488d..9debb68e 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1995,60 +1995,6 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) CcspTraceError(("failed to run cmd: %s", cmdLine)); } #endif - //Restart LAN if required. - BOOL bRestartLan = FALSE; - - CcspTraceWarning(("%s: globalIP %s PreviousIPv6Address %s\n", __func__, - globalIP, PreviousIPv6Address)); - if ( _ansc_strcmp(globalIP, PreviousIPv6Address ) ){ - bRestartLan = TRUE; - - //PaM may restart. When this happen, we should not overwrite previous ipv6 - if ( PreviousIPv6Address[0] ) - sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6_prev", PreviousIPv6Address, 0); - - strncpy(PreviousIPv6Address, globalIP,sizeof(PreviousIPv6Address)); - }else{ - char lanrestart[8] = {0}; - sysevent_get(sysevent_fd, sysevent_token, "lan_restarted", lanrestart, sizeof(lanrestart)); - fprintf(stderr,"lan restart staus is %s \n",lanrestart); - if (strcmp("true",lanrestart) == 0) - bRestartLan = TRUE; - else - bRestartLan = FALSE; - } - CcspTraceWarning(("%s: bRestartLan %d\n", __func__, bRestartLan)); - if ( ret != 0 ) - { - CcspTraceError(("error, assign global ip error.\n")); - }else if ( bRestartLan == FALSE ){ - CcspTraceError(("Same global IP, Need not restart.\n")); - }else{ - char pref_len[10] ={0}; - - CcspTraceWarning(("Restart lan%s:%d\n", __func__,__LINE__)); - /* This is for IP.Interface.1. use */ - sysevent_set(sysevent_fd, sysevent_token, COSA_DML_DHCPV6S_ADDR_SYSEVENT_NAME, globalIP, 0); - - /*This is for brlan0 interface */ - sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); - sscanf (pVirtIf->IP.Ipv6Data.sitePrefix,"%*[^/]/%s" ,pref_len); - sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_v6", pref_len, 0); - CcspTraceWarning(("%s: setting lan-restart\n", __FUNCTION__)); - sysevent_set(sysevent_fd, sysevent_token, "lan-restart", "1", 0); - - // Below code copied from CosaDmlDHCPv6sTriggerRestart(FALSE) PAm function. - int fd = 0; - char str[32] = "restart"; - fd= open(DHCPS6V_SERVER_RESTART_FIFO, O_RDWR); - if (fd < 0) - { - fprintf(stderr, "open dhcpv6 server restart fifo when writing.\n"); - return 1; - } - write( fd, str, sizeof(str) ); - close(fd); - } } /* Sysevent set moved from wanmgr_handle_dhcpv6_event_data */ @@ -2077,7 +2023,6 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIXPLTIME, set_value, 0); syscfg_set_string(SYSCFG_FIELD_PREVIOUS_IPV6_PREFIX, pVirtIf->IP.Ipv6Data.sitePrefixOld); syscfg_set_string(SYSCFG_FIELD_IPV6_PREFIX, pVirtIf->IP.Ipv6Data.sitePrefix); - syscfg_set_string("lan_prefix", pVirtIf->IP.Ipv6Data.sitePrefix); // create global IPv6 address (::1) char prefix[BUFLEN_64] = {0}; memset(prefix, 0, sizeof(prefix)); @@ -2093,6 +2038,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) CcspTraceInfo(("%s %d new prefix = %s\n", __FUNCTION__, __LINE__, pVirtIf->IP.Ipv6Data.sitePrefix)); strncat(prefix, "/64",sizeof(prefix)-1); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIX, prefix, 0); + sysevent_set(sysevent_fd, sysevent_token, "lan_prefix", prefix, 0); } }else /* IFADDRCONF_REMOVE: prefix remove */ { @@ -2112,6 +2058,40 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) } /* Sysevent set moved from wanmgr_handle_dhcpv6_event_data end */ +#ifdef LAN_MGR_SUPPORT + //Restart RA(stateless) server + sysevent_set(sysevent_fd, sysevent_token, "dhcpv6_raserver-restart", NULL, 0); + //recreate Stateful v6 conf + sysevent_set(sysevent_fd, sysevent_token, "redirect_URL", NULL, 0); + //Restart Stateful V6 server + sysevent_set(sysevent_fd, sysevent_token, "dhcpv6-restart", NULL, 0); + +#else + //FIXME: does zebra-restart necessory after RADVD_RESTART + sysevent_set(sysevent_fd, sysevent_token, "zebra-restart", NULL, 0); + CcspTraceWarning(("Restart lan%s:%d\n", __func__,__LINE__)); + /* This is for IP.Interface.1. use */ + sysevent_set(sysevent_fd, sysevent_token, COSA_DML_DHCPV6S_ADDR_SYSEVENT_NAME, globalIP, 0); + + /*This is for brlan0 interface */ + sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); + sscanf (pVirtIf->IP.Ipv6Data.sitePrefix,"%*[^/]/%s" ,pref_len); + sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_v6", pref_len, 0); + CcspTraceWarning(("%s: setting lan-restart\n", __FUNCTION__)); + sysevent_set(sysevent_fd, sysevent_token, "lan-restart", "1", 0); + + // Below code copied from CosaDmlDHCPv6sTriggerRestart(FALSE) PAm function. + int fd = 0; + char str[32] = "restart"; + fd= open(DHCPS6V_SERVER_RESTART_FIFO, O_RDWR); + if (fd < 0) + { + fprintf(stderr, "open dhcpv6 server restart fifo when writing.\n"); + return 1; + } + write( fd, str, sizeof(str) ); + close(fd); +#endif #endif return RETURN_OK; } diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index e499d345..5588bbb4 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1310,12 +1310,6 @@ static int wan_setUpIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_CONNECTION_STATE, WAN_STATUS_UP, 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); -#ifdef LAN_MGR_SUPPORT - sysevent_set(sysevent_fd, sysevent_token, "dhcpv6_raserver-restart", NULL, 0); -#else - //FIXME: does zebra-restart necessory after RADVD_RESTART - sysevent_set(sysevent_fd, sysevent_token, "zebra-restart", NULL, 0); -#endif sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_DHCP_SERVER_RESTART, NULL, 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_WAN_STATUS, buf, sizeof(buf)); From dd2db9c9e497f519a3f0dbdd9504a55689667535 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Wed, 14 Aug 2024 14:31:36 +0000 Subject: [PATCH 13/64] Fixing build error for sky and cleanup Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 67 +++++++++----------------- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 9debb68e..4e137f2b 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1644,7 +1644,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { CcspTraceInfo(("assigned IPv6 address \n")); connected = TRUE; -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* TODO: Assign IPv6 address on Wan Interface when received, if dhcpv6 client didn't assign on the ineterface. * Currently dibbler client will assign IA_NA to the interface. * VISM will assign the prefix on LAN interface. @@ -1683,7 +1683,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) connected = TRUE; /* Update the WAN prefix validity time in the persistent storage */ -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) && !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) if (pDhcp6cInfoCur->prefixVltime != pNewIpcMsg->prefixVltime) { snprintf(set_value, sizeof(set_value), "%d", pNewIpcMsg->prefixVltime); @@ -1738,7 +1738,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (strcmp(pDhcp6cInfoCur->sitePrefix, pNewIpcMsg->sitePrefix) == 0) { CcspTraceInfo(("remove prefix \n")); -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) && !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) syscfg_set(NULL, SYSCFG_FIELD_IPV6_PREFIX, ""); syscfg_set(NULL, SYSCFG_FIELD_PREVIOUS_IPV6_PREFIX, ""); syscfg_set_commit(NULL, SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, ""); @@ -1758,7 +1758,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } #endif -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE)&& !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* dhcp6c receives domain name information */ if (pNewIpcMsg->domainNameAssigned && !IS_EMPTY_STRING(pNewIpcMsg->domainName)) { @@ -1792,7 +1792,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (strcmp(pDhcp6cInfoCur->address, guAddrPrefix)) { -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_)) //TODO: V6 handled in PAM +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) strncpy(Ipv6DataNew.address, guAddr, sizeof(Ipv6DataNew.address)-1); pNewIpcMsg->addrAssigned = true; #else @@ -1813,17 +1813,11 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (connected) { -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) || (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_))//Do not compare if pdIfAddress and sitePrefix is empty. pdIfAddress Will be calculated while configuring LAN prefix. //TODO: V6 handled in PAM if ((strlen(Ipv6DataNew.address) > 0 && strcmp(Ipv6DataNew.address, pDhcp6cInfoCur->address)) || - ((strlen(Ipv6DataNew.pdIfAddress) > 0) && (strcmp(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress))) || - ((strlen(Ipv6DataNew.sitePrefix) > 0) && (strcmp(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix)))|| -#else - if (strcmp(Ipv6DataNew.address, pDhcp6cInfoCur->address) || - strcmp(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress) || - strcmp(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix) || -#endif + ((strlen(Ipv6DataNew.pdIfAddress) > 0) && (strcmp(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress))) || + ((strlen(Ipv6DataNew.sitePrefix) > 0) && (strcmp(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix)))|| strcmp(Ipv6DataNew.nameserver, pDhcp6cInfoCur->nameserver) || - strcmp(Ipv6DataNew.nameserver1, pDhcp6cInfoCur->nameserver1)) + strcmp(Ipv6DataNew.nameserver1, pDhcp6cInfoCur->nameserver1)) { CcspTraceInfo(("IPv6 configuration has been changed \n")); pVirtIf->IP.Ipv6Changed = TRUE; @@ -1839,13 +1833,15 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } else { - /*TODO: Revisit this*/ - //call function for changing the prlft and vallft - if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) + if(pVirtIf->Status == WAN_IFACE_STATUS_UP) //Update life time only if the interface is active. { - CcspTraceError(("Life Time Setting Failed")); + //call function for changing the prlft and vallft + if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) + { + CcspTraceError(("Life Time Setting Failed")); + } + sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); } - sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); pVirtIf->IP.Ipv6Renewed = TRUE; } // update current IPv6 Data @@ -1960,8 +1956,8 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) if(ret != 0) { CcspTraceInfo(("Assign global ip error \n")); } -#ifdef _HUB4_PRODUCT_REQ_ - else { + else + { CcspTraceInfo(("%s Going to set [%s] address on brlan0 interface \n", __FUNCTION__, globalIP)); memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/64 dev %s valid_lft %d preferred_lft %d", @@ -1969,32 +1965,19 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); + /*This is for brlan0 interface */ + char pref_len[10] ={0}; + sscanf (pVirtIf->IP.Ipv6Data.sitePrefix,"%*[^/]/%s" ,pref_len); + sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_v6", pref_len, 0); sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); - // send an event to wanmanager that Global-prefix is set - sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_set", globalIP, 0); - } -#else - else { - sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); - + sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_set", globalIP, 0); //TODO: This was a event to Wanmanager. if no other process listens to it. remove it. } - // send an event to wanmanager that Global-prefix is set - sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_set", globalIP, 0); -#endif memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 route add %s dev %s", pVirtIf->IP.Ipv6Data.sitePrefix, COSA_DML_DHCPV6_SERVER_IFNAME); if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) { CcspTraceError(("failed to run cmd: %s", cmdLine)); } -#ifdef _COSA_INTEL_XB3_ARM_ - memset(cmdLine, 0, sizeof(cmdLine)); - snprintf(cmdLine, sizeof(cmdLine), "ip -6 route add %s dev %s table erouter", pVirtIf->IP.Ipv6Data.sitePrefix, COSA_DML_DHCPV6_SERVER_IFNAME); - if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) - { - CcspTraceError(("failed to run cmd: %s", cmdLine)); - } -#endif } /* Sysevent set moved from wanmgr_handle_dhcpv6_event_data */ @@ -2011,6 +1994,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) syscfg_set_string(SYSCFG_FIELD_IPV6_ADDRESS, ""); } } + if (pVirtIf->IP.Ipv6Data.prefixAssigned && !IS_EMPTY_STRING(pVirtIf->IP.Ipv6Data.sitePrefix)) { if (pVirtIf->IP.Ipv6Data.prefixCmd == IFADDRCONF_ADD && @@ -2067,16 +2051,11 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) sysevent_set(sysevent_fd, sysevent_token, "dhcpv6-restart", NULL, 0); #else - //FIXME: does zebra-restart necessory after RADVD_RESTART sysevent_set(sysevent_fd, sysevent_token, "zebra-restart", NULL, 0); CcspTraceWarning(("Restart lan%s:%d\n", __func__,__LINE__)); /* This is for IP.Interface.1. use */ sysevent_set(sysevent_fd, sysevent_token, COSA_DML_DHCPV6S_ADDR_SYSEVENT_NAME, globalIP, 0); - /*This is for brlan0 interface */ - sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); - sscanf (pVirtIf->IP.Ipv6Data.sitePrefix,"%*[^/]/%s" ,pref_len); - sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_v6", pref_len, 0); CcspTraceWarning(("%s: setting lan-restart\n", __FUNCTION__)); sysevent_set(sysevent_fd, sysevent_token, "lan-restart", "1", 0); From ff18e4b0e03a4a5681f1df09ade371e2dd071eca Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Wed, 14 Aug 2024 16:02:49 +0000 Subject: [PATCH 14/64] Code clean up Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 81 ++++++++++++++++---------- 1 file changed, 50 insertions(+), 31 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 4e137f2b..1789c3db 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1636,6 +1636,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) return ANSC_STATUS_SUCCESS; } +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* dhcp6c receives an IPv6 address for WAN interface */ if (pNewIpcMsg->addrAssigned) @@ -1644,13 +1645,57 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { CcspTraceInfo(("assigned IPv6 address \n")); connected = TRUE; -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - /* TODO: Assign IPv6 address on Wan Interface when received, if dhcpv6 client didn't assign on the ineterface. - * Currently dibbler client will assign IA_NA to the interface. - * VISM will assign the prefix on LAN interface. + + /* TODO: Assign IPv6 address on Wan Interface when received, if dhcpv6 client didn't assign on the ineterface. + * Currently dibbler client will assign IA_NA to the interface. + * VISM will assign the prefix on LAN interface. */ } + } + else if(pDhcp6cInfoCur->addrAssigned && Ipv6DataNew.prefixAssigned) + { + CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); + strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); + pNewIpcMsg->addrAssigned = true; + Ipv6DataNew.addrAssigned = true; + } + + /* dhcp6c receives prefix delegation for LAN */ + if (pNewIpcMsg->prefixAssigned && !IS_EMPTY_STRING(pNewIpcMsg->sitePrefix)) + { + if (pNewIpcMsg->prefixCmd == IFADDRCONF_ADD && + pNewIpcMsg->prefixPltime != 0 && pNewIpcMsg->prefixVltime != 0) + { + CcspTraceInfo(("assigned prefix=%s \n", pNewIpcMsg->sitePrefix)); + connected = TRUE; + } + else /* IFADDRCONF_REMOVE: prefix remove */ + { + /* Validate if the prefix to be removed is the same as the stored prefix */ + if (strcmp(pDhcp6cInfoCur->sitePrefix, pNewIpcMsg->sitePrefix) == 0) + { + CcspTraceInfo(("remove prefix \n")); + WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_CONNECTION_IPV6_DOWN); + } + } + } + else if(pDhcp6cInfoCur->prefixAssigned && Ipv6DataNew.addrAssigned) + { + CcspTraceWarning(("%s %d IAPD is not assigned in this IPC msg, but we have IAPD configured from previous lease. Assuming only IANA renewed. \n", __FUNCTION__, __LINE__)); + strncpy(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix, sizeof(Ipv6DataNew.sitePrefix)); + strncpy(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataNew.pdIfAddress)); + pNewIpcMsg->prefixAssigned = true; + Ipv6DataNew.prefixAssigned = true; + } + #else + /* dhcp6c receives an IPv6 address for WAN interface */ + if (pNewIpcMsg->addrAssigned) + { + if (pNewIpcMsg->addrCmd == IFADDRCONF_ADD) + { + CcspTraceInfo(("assigned IPv6 address \n")); + connected = TRUE; if (strcmp(pDhcp6cInfoCur->address, pNewIpcMsg->address)) { syscfg_set_string(SYSCFG_FIELD_IPV6_ADDRESS, pNewIpcMsg->address); @@ -1661,17 +1706,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) CcspTraceInfo(("remove IPv6 address \n")); syscfg_set_string(SYSCFG_FIELD_IPV6_ADDRESS, ""); } -#endif } -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - else if(pDhcp6cInfoCur->addrAssigned && Ipv6DataNew.prefixAssigned) - { - CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); - strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); - pNewIpcMsg->addrAssigned = true; - Ipv6DataNew.addrAssigned = true; - } -#endif /* dhcp6c receives prefix delegation for LAN */ if (pNewIpcMsg->prefixAssigned && !IS_EMPTY_STRING(pNewIpcMsg->sitePrefix)) @@ -1683,7 +1718,6 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) connected = TRUE; /* Update the WAN prefix validity time in the persistent storage */ -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) if (pDhcp6cInfoCur->prefixVltime != pNewIpcMsg->prefixVltime) { snprintf(set_value, sizeof(set_value), "%d", pNewIpcMsg->prefixVltime); @@ -1730,7 +1764,6 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIX, prefix, 0); } } -#endif } else /* IFADDRCONF_REMOVE: prefix remove */ { @@ -1738,27 +1771,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (strcmp(pDhcp6cInfoCur->sitePrefix, pNewIpcMsg->sitePrefix) == 0) { CcspTraceInfo(("remove prefix \n")); -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) syscfg_set(NULL, SYSCFG_FIELD_IPV6_PREFIX, ""); syscfg_set(NULL, SYSCFG_FIELD_PREVIOUS_IPV6_PREFIX, ""); syscfg_set_commit(NULL, SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, ""); -#endif WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_CONNECTION_IPV6_DOWN); } } } -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - else if(pDhcp6cInfoCur->prefixAssigned && Ipv6DataNew.addrAssigned) - { - CcspTraceWarning(("%s %d IAPD is not assigned in this IPC msg, but we have IAPD configured from previous lease. Assuming only IANA renewed. \n", __FUNCTION__, __LINE__)); - strncpy(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix, sizeof(Ipv6DataNew.sitePrefix)); - strncpy(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataNew.pdIfAddress)); - pNewIpcMsg->prefixAssigned = true; - Ipv6DataNew.prefixAssigned = true; - } -#endif -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* dhcp6c receives domain name information */ if (pNewIpcMsg->domainNameAssigned && !IS_EMPTY_STRING(pNewIpcMsg->domainName)) { @@ -1792,10 +1812,9 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) if (strcmp(pDhcp6cInfoCur->address, guAddrPrefix)) { -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) strncpy(Ipv6DataNew.address, guAddr, sizeof(Ipv6DataNew.address)-1); pNewIpcMsg->addrAssigned = true; -#else +#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) syscfg_set_string(SYSCFG_FIELD_IPV6_ADDRESS, guAddrPrefix); #endif } From 6dd2568c201d62d38547619298fd2a6217926852 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Thu, 15 Aug 2024 12:49:28 +0000 Subject: [PATCH 15/64] Moving default route to a new struct independent of DHCPv6 data Signed-off-by: S-Parthiban-Selvaraj --- source/TR-181/include/wanmgr_dml.h | 8 ++++++-- source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c | 2 +- source/WanManager/wanmgr_interface_sm.c | 1 + source/WanManager/wanmgr_net_utils.c | 6 +++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/source/TR-181/include/wanmgr_dml.h b/source/TR-181/include/wanmgr_dml.h index 5c7b560d..2fa37b1c 100644 --- a/source/TR-181/include/wanmgr_dml.h +++ b/source/TR-181/include/wanmgr_dml.h @@ -329,8 +329,6 @@ typedef struct _WANMGR_IPV6_DATA uint32_t prefixPltime; uint32_t prefixVltime; char sitePrefixOld[BUFLEN_48]; /**< add support for RFC7084 requirement L-13 */ - char defaultRoute[INET6_ADDRSTRLEN]; /**< add support for RFC7084 requirement L-13 */ - uint32_t defRouteLifeTime; #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) /* Params to store the IPv6 IPC message */ bool addrAssigned; @@ -341,6 +339,11 @@ typedef struct _WANMGR_IPV6_DATA #endif } WANMGR_IPV6_DATA; +typedef struct _WANMGR_IPV6_RA_DATA +{ + char defaultRoute[INET6_ADDRSTRLEN]; /**< add support for RFC7084 requirement L-13 */ + uint32_t defRouteLifeTime; +} WANMGR_IPV6_RA_DATA; typedef struct _DML_WANIFACE_IP { @@ -369,6 +372,7 @@ typedef struct _DML_WANIFACE_IP BOOL Ipv6Renewed; WANMGR_IPV4_DATA Ipv4Data; WANMGR_IPV6_DATA Ipv6Data; + WANMGR_IPV6_RA_DATA Ipv6Route; ipc_dhcpv4_data_t* pIpcIpv4Data; ipc_dhcpv6_data_t* pIpcIpv6Data; UINT Dhcp4cPid; diff --git a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c index 03fd1955..c62a251e 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c @@ -1883,7 +1883,7 @@ ANSC_STATUS WanMgr_Configure_TAD_WCC(DML_VIRTUAL_IFACE *p_VirtIf, WCC_EVENT Eve snprintf(pTADEvent->IPv4_DNS_Servers, sizeof(pTADEvent->IPv4_DNS_Servers), "%s,%s",p_VirtIf->IP.Ipv4Data.dnsServer,p_VirtIf->IP.Ipv4Data.dnsServer1); snprintf(pTADEvent->IPv4_Gateway, sizeof(pTADEvent->IPv4_Gateway), "%s",p_VirtIf->IP.Ipv4Data.gateway); snprintf(pTADEvent->IPv6_DNS_Servers, sizeof(pTADEvent->IPv6_DNS_Servers), "%s,%s",p_VirtIf->IP.Ipv6Data.nameserver,p_VirtIf->IP.Ipv6Data.nameserver1); - snprintf(pTADEvent->IPv6_Gateway, sizeof(pTADEvent->IPv6_Gateway), "%s",p_VirtIf->IP.Ipv6Data.defaultRoute,p_VirtIf->IP.Ipv6Data.defaultRoute); + snprintf(pTADEvent->IPv6_Gateway, sizeof(pTADEvent->IPv6_Gateway), "%s",p_VirtIf->IP.Ipv6Route.defaultRoute,p_VirtIf->IP.Ipv6Route.defaultRoute); pTADEvent->Event = Event; //Run in thread to avoid mutex deadlock between WanManager and rbus handle diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 5588bbb4..5bf33d4c 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1674,6 +1674,7 @@ static ANSC_STATUS WanManager_ClearDHCPData(DML_VIRTUAL_IFACE * pVirtIf) pVirtIf->IP.Ipv6Changed = FALSE; pVirtIf->IP.Ipv6Renewed = FALSE; memset(&(pVirtIf->IP.Ipv6Data), 0, sizeof(WANMGR_IPV6_DATA)); + memset(&(pVirtIf->IP.Ipv6Route), 0, sizeof(WANMGR_IPV6_RA_DATA)); pVirtIf->IP.Dhcp6cPid = 0; if(pVirtIf->IP.pIpcIpv6Data != NULL) { diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 800be9e7..6a6c05ea 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -2727,9 +2727,9 @@ static int receive_router_advert(int sockfd, DML_VIRTUAL_IFACE * p_VirtIf) if (hdr->icmp6_type == ND_ROUTER_ADVERT) { struct nd_router_advert *ra = (struct nd_router_advert *)buffer; - inet_ntop (AF_INET6, &src_addr.sin6_addr, p_VirtIf->IP.Ipv6Data.defaultRoute, sizeof (p_VirtIf->IP.Ipv6Data.defaultRoute)); - p_VirtIf->IP.Ipv6Data.defRouteLifeTime = ntohs(ra->nd_ra_router_lifetime); - CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %d\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Data.defaultRoute, p_VirtIf->IP.Ipv6Data.defRouteLifeTime)); + inet_ntop (AF_INET6, &src_addr.sin6_addr, p_VirtIf->IP.Ipv6Route.defaultRoute, sizeof (p_VirtIf->IP.Ipv6Route.defaultRoute)); + p_VirtIf->IP.Ipv6Route.defRouteLifeTime = ntohs(ra->nd_ra_router_lifetime); + CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %d\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Route.defaultRoute, p_VirtIf->IP.Ipv6Route.defRouteLifeTime)); ret = 0; } From 7f06a7c7dbc96d367825556b98184bcf3cbccd0e Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Thu, 15 Aug 2024 14:27:55 +0000 Subject: [PATCH 16/64] replacing RS and RA funtion with rdisc6 utility Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 2 +- source/WanManager/wanmgr_interface_sm.c | 41 +++---- source/WanManager/wanmgr_net_utils.c | 150 +++++------------------- 3 files changed, 53 insertions(+), 140 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 1789c3db..55883140 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1852,7 +1852,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } else { - if(pVirtIf->Status == WAN_IFACE_STATUS_UP) //Update life time only if the interface is active. + if(pVirtIf->Status == WAN_IFACE_STATUS_UP && pNewIpcMsg->prefixPltime > 0 && pNewIpcMsg->prefixVltime > 0 ) //Update life time only if the interface is active. { //call function for changing the prlft and vallft if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 5bf33d4c..3e90b155 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -948,26 +948,8 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) } } - if(route_flag == 0) { - buffer[0] = '\0'; - if ((fp_route = popen("ip -6 ro | grep default", "r"))) { - if(fp_route != NULL) { - fgets(buffer, BUFLEN_256, fp_route); - if(strlen(buffer) > 0 ) { - route_flag = 1; - } - pclose(fp_route); - } - } - } - - if(dad_flag == 0 || route_flag == 0) + if(dad_flag == 0) { - if(route_flag == 0) - { - //If the default route is not present, Send a router solicit. - WanManager_send_and_receive_rs(p_VirtIf); - } sleep(1); } else @@ -976,7 +958,25 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) } } - if(dad_flag == 0 || route_flag == 0) { + buffer[0] = '\0'; + if ((fp_route = popen("ip -6 ro | grep default", "r"))) { + if(fp_route != NULL) { + fgets(buffer, BUFLEN_256, fp_route); + if(strlen(buffer) > 0 ) { + route_flag = 1; + } + pclose(fp_route); + } + } + + if(route_flag == 0) + { + //If the default route is not present, Send a router solicit. + WanManager_send_and_receive_rs(p_VirtIf); + } + + if(dad_flag == 0 || route_flag == 0) + { CcspTraceError(("%s %d dad_flag[%d] route_flag[%d] Failed \n", __FUNCTION__, __LINE__,dad_flag,route_flag)); return -1; } @@ -989,6 +989,7 @@ static int checkIpv6AddressAssignedToBridge(DML_VIRTUAL_IFACE* p_VirtIf) char lanPrefix[BUFLEN_128] = {0}; int ret = RETURN_ERR; + //TODO: sysevent_get required ? sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_GLOBAL_IPV6_PREFIX_SET, lanPrefix, sizeof(lanPrefix)); if(strlen(lanPrefix) > 0) diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 6a6c05ea..479bdf7f 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -2651,141 +2651,53 @@ ANSC_STATUS WanManager_get_interface_mac(char *interfaceName, char* macAddress, } //Send and receive RS -#define RS_RA_TIMEOUT 2 -#define RS_MSG_SIZE 8 -#define RA_MSG_SIZE 1024 -struct in6_pktinfo { - struct in6_addr ipi6_addr; - unsigned int ipi6_ifindex; -}; - -static int send_router_solicit(int sockfd, struct sockaddr_in6 *dest_addr, const char *if_name) -{ - struct icmp6_hdr rs_hdr; - memset(&rs_hdr, 0, sizeof(rs_hdr)); - rs_hdr.icmp6_type = ND_ROUTER_SOLICIT; - - CcspTraceInfo(("%s %d: \n", __FUNCTION__, __LINE__)); - struct msghdr msg; - struct iovec iov; - struct sockaddr_in6 src_addr; - struct cmsghdr *cmsg; - char cmsgbuf[CMSG_SPACE(sizeof(struct in6_pktinfo))]; - - memset(&msg, 0, sizeof(msg)); - memset(&src_addr, 0, sizeof(src_addr)); - memset(cmsgbuf, 0, sizeof(cmsgbuf)); - - src_addr.sin6_family = AF_INET6; - src_addr.sin6_addr = in6addr_any; - - iov.iov_base = &rs_hdr; - iov.iov_len = sizeof(rs_hdr); - - msg.msg_name = dest_addr; - msg.msg_namelen = sizeof(*dest_addr); - msg.msg_iov = &iov; - msg.msg_iovlen = 1; - msg.msg_control = cmsgbuf; - msg.msg_controllen = sizeof(cmsgbuf); - - cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo)); - cmsg->cmsg_level = IPPROTO_IPV6; - cmsg->cmsg_type = IPV6_PKTINFO; - - struct in6_pktinfo *pktinfo = (struct in6_pktinfo *)CMSG_DATA(cmsg); - memset(pktinfo, 0, sizeof(struct in6_pktinfo)); - - pktinfo->ipi6_ifindex = if_nametoindex(if_name); - if (sendmsg(sockfd, &msg, 0) < 0) { - CcspTraceError(("%s %d: sendmsg failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); - return -1; - } - CcspTraceInfo(("%s %d: RS sent from interface %s and index %d \n", __FUNCTION__, __LINE__, if_name, pktinfo->ipi6_ifindex)); - - return 0; -} - -static int receive_router_advert(int sockfd, DML_VIRTUAL_IFACE * p_VirtIf) +int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * p_VirtIf) { + struct in6_addr addr; int ret = -1; - char buffer[RA_MSG_SIZE]; - struct sockaddr_in6 src_addr; - socklen_t addrlen = sizeof(src_addr); - ssize_t len; - - len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&src_addr, &addrlen); - if (len < 0) - { - CcspTraceError(("%s %d: recvfrom Failed %s \n", __FUNCTION__, __LINE__, strerror(errno))); - return -1; - } - - struct icmp6_hdr *hdr = (struct icmp6_hdr *)buffer; + char command[256]; + char buffer[512]; + FILE *fp; - if (hdr->icmp6_type == ND_ROUTER_ADVERT) - { - struct nd_router_advert *ra = (struct nd_router_advert *)buffer; - inet_ntop (AF_INET6, &src_addr.sin6_addr, p_VirtIf->IP.Ipv6Route.defaultRoute, sizeof (p_VirtIf->IP.Ipv6Route.defaultRoute)); - p_VirtIf->IP.Ipv6Route.defRouteLifeTime = ntohs(ra->nd_ra_router_lifetime); - CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %d\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Route.defaultRoute, p_VirtIf->IP.Ipv6Route.defRouteLifeTime)); - ret = 0; - } + CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, p_VirtIf->Name)); + // Prepare the command to execute rdisc6 on the specified interface + snprintf(command, sizeof(command), "rdisc6 %s", p_VirtIf->Name ); - if(ret != 0) + // Execute the command and open a pipe to read its output + if ((fp = popen(command, "r")) == NULL) { - CcspTraceError(("%s %d: Router Advertisement isn't received. \n", __FUNCTION__, __LINE__)); - } - return ret; -} - -int WanManager_send_and_receive_rs(DML_VIRTUAL_IFACE * pVirtIf) -{ - int ret = -1; - int sockfd; - struct sockaddr_in6 dest_addr; - int retry = 3; //default retry - - CcspTraceInfo(("%s %d: Requesting Router solicit for %s \n", __FUNCTION__, __LINE__, pVirtIf->Name)); - sockfd = socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6); - if (sockfd < 0) { - CcspTraceError(("%s %d: sock creation failed %s\n", __FUNCTION__, __LINE__, strerror(errno))); + perror("popen"); return -1; } - memset(&dest_addr, 0, sizeof(dest_addr)); - dest_addr.sin6_family = AF_INET6; - inet_pton(AF_INET6, "ff02::2", &dest_addr.sin6_addr); // Set destination address to all routers - - struct timeval tv; - tv.tv_sec = RS_RA_TIMEOUT; - tv.tv_usec = 0; - setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); - setsockopt (sockfd, SOL_SOCKET, SO_DONTROUTE, &(int){1}, sizeof (int)); - setsockopt (sockfd, IPPROTO_IPV6, IPV6_RECVHOPLIMIT, &(int){ 1 }, sizeof (int)); - setsockopt (sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &(int){ 255 }, sizeof (int)); - setsockopt (sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &(int){ 255 }, sizeof (int)); - - while(retry > 0) + // Read the output line by line + while (fgets(buffer, sizeof(buffer), fp) != NULL) { - retry--; - ret = send_router_solicit(sockfd, &dest_addr, pVirtIf->Name); - if (ret != 0) + if (strstr(buffer, "Route lifetime")) { - CcspTraceError(("%s %d: Router Solicit send failed. Retry %d \n", __FUNCTION__, __LINE__, retry)); - continue; + sscanf(buffer, " Route lifetime : %d", &p_VirtIf->IP.Ipv6Route.defRouteLifeTime); } - ret = receive_router_advert(sockfd, pVirtIf); - if(ret == 0) + // Look for the "from" line to identify the default route address + if (strstr(buffer, "from")) { - break; + sscanf(buffer, " from %s", p_VirtIf->IP.Ipv6Route.defaultRoute); + if (inet_pton(AF_INET6, p_VirtIf->IP.Ipv6Route.defaultRoute, &addr) == 1) //check parsed value is a valid ipv6 address + { + ret = 0; + break; + } } - CcspTraceError(("%s %d: Router Advertisement Retry %d \n", __FUNCTION__, __LINE__, retry)); } - close(sockfd); + // Close the pipe + pclose(fp); + + if(ret == 0) + { + CcspTraceInfo(("%s %d: Received Router Advertisement with default route %s lifetime %d\n", __FUNCTION__, __LINE__, p_VirtIf->IP.Ipv6Route.defaultRoute, p_VirtIf->IP.Ipv6Route.defRouteLifeTime)); + } + return ret; } From 7828845e693239e58173ba1e4515feea7706ed39 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Thu, 15 Aug 2024 17:33:36 +0000 Subject: [PATCH 17/64] removing checkIpv6AddressAssignedToBridge function Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 72 ++++++++++--------------- source/WanManager/wanmgr_net_utils.c | 8 ++- 2 files changed, 31 insertions(+), 49 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 3e90b155..58c20913 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -185,12 +185,6 @@ static ANSC_STATUS WanManager_ClearDHCPData(DML_VIRTUAL_IFACE * pVirtIf); * lan ipv6 address ready to use. * @return RETURN_OK on success else RETURN_ERR *************************************************************************************/ -static int checkIpv6AddressAssignedToBridge(DML_VIRTUAL_IFACE* p_VirtIf); - -/************************************************************************************* - * @brief Check IPv6 address is ready to use or not - * @return RETURN_OK on success else RETURN_ERR - *************************************************************************************/ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf); #ifdef FEATURE_MAPT @@ -901,6 +895,13 @@ int wan_updateDNS(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl, BOOL addIPv4, BOOL return ret; } +/* Check Duplicate Address Detection (DAD) status. The way it works is that + after an address is added to an interface, the operating system uses the + Neighbor Discovery Protocol to check if any other host on the network + has the same address. The whole process will take around 3 to 4 seconds + to complete. Also we need to check and ensure that the gateway has + a valid default route entry. + */ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) { char buffer[BUFLEN_256] = {0}; @@ -913,13 +914,6 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) char IfaceName[BUFLEN_16] = {0}; int BridgeMode = 0; - /* Check Duplicate Address Detection (DAD) status. The way it works is that - after an address is added to an interface, the operating system uses the - Neighbor Discovery Protocol to check if any other host on the network - has the same address. The whole process will take around 3 to 4 seconds - to complete. Also we need to check and ensure that the gateway has - a valid default route entry. - */ /*TODO: *Below Code should be removed once V6 Prefix/IP is assigned on erouter0 Instead of brlan0 for sky Devices. @@ -934,13 +928,24 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) } CcspTraceInfo(("%s-%d: IfaceName=%s, BridgeMode=%d \n", __FUNCTION__, __LINE__, IfaceName, BridgeMode)); - for(i=0; i<15; i++) { + /* TODO: the below code assumes if the LAN ipv6 address is tentaive for 15 seconds DAD has failed. Do we need additional check? + * IANA dad is handled in the DHCPv6 client for the Wan Interface. + * Should we remove the IP from LAN bridge and request a different Delegated prefix? + * Should we mendate EUI-64 based Interface identifiers for all platforms? + */ + + for(i=0; i<15; i++) + { buffer[0] = '\0'; - if(dad_flag == 0) { - if ((fp_dad = v_secure_popen("r","ip address show dev %s tentative", IfaceName))) { - if(fp_dad != NULL) { + if(dad_flag == 0) + { + if ((fp_dad = v_secure_popen("r","ip address show dev %s tentative", IfaceName))) + { + if(fp_dad != NULL) + { fgets(buffer, BUFLEN_256, fp_dad); - if(strlen(buffer) == 0 ) { + if(strlen(buffer) == 0 ) + { dad_flag = 1; } v_secure_pclose(fp_dad); @@ -984,27 +989,6 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) return 0; } -static int checkIpv6AddressAssignedToBridge(DML_VIRTUAL_IFACE* p_VirtIf) -{ - char lanPrefix[BUFLEN_128] = {0}; - int ret = RETURN_ERR; - - //TODO: sysevent_get required ? - sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_GLOBAL_IPV6_PREFIX_SET, lanPrefix, sizeof(lanPrefix)); - - if(strlen(lanPrefix) > 0) - { - CcspTraceInfo(("%s %d lanPrefix[%s] \n", __FUNCTION__, __LINE__,lanPrefix)); - if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == 0) - { - ret = RETURN_OK; - } - } - - return ret; -} - - static void updateInterfaceToVoiceManager(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl, bool voip_started) { ANSC_STATUS retStatus = ANSC_STATUS_FAILURE; @@ -3204,7 +3188,7 @@ static eWanState_t wan_state_obtaining_ip_addresses(WanMgr_IfaceSM_Controller_t* p_VirtIf->IP.Ipv6Changed = FALSE; return WAN_STATE_OBTAINING_IP_ADDRESSES; } - if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) + if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) { return wan_transition_ipv6_up(pWanIfaceCtrl); } @@ -3299,7 +3283,7 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) } p_VirtIf->IP.Ipv6Changed == FALSE; } - if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) + if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) { ret = wan_transition_ipv6_up(pWanIfaceCtrl); CcspTraceInfo((" %s %d - IPv6 Address Assigned to Bridge Yet.\n", __FUNCTION__, __LINE__)); @@ -3421,7 +3405,7 @@ static eWanState_t wan_state_ipv4_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC p_VirtIf->IP.Ipv6Changed = FALSE; return WAN_STATE_IPV4_LEASED; } - if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) + if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) { return wan_transition_ipv6_up(pWanIfaceCtrl); } @@ -3532,7 +3516,7 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC pInterface->Selection.Status == WAN_IFACE_ACTIVE && p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) { - if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration + if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); } @@ -3670,7 +3654,7 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan pInterface->Selection.Status == WAN_IFACE_ACTIVE && p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) { - if (checkIpv6AddressAssignedToBridge(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration + if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); } diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 479bdf7f..4e6f3c3a 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -44,11 +44,8 @@ #include #include #include -#include -#include -#include -#include -#include + +#if defined(FEATURE_464XLAT) #include #include #include @@ -57,6 +54,7 @@ #include #include #include +#endif #define BROADCAST_IP "255.255.255.255" /* To ignore link local addresses configured as DNS servers, From 5c6acd884ebf2599ff66af664cd3cb99a062a934 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Mon, 19 Aug 2024 15:30:26 +0000 Subject: [PATCH 18/64] Cleaning up RestartV6Client workaround created for restarting Ipv6 cleint after WFO Signed-off-by: Parthiban Selvaraj --- source/TR-181/include/wanmgr_dml.h | 3 +- source/WanManager/wanmgr_data.c | 1 - source/WanManager/wanmgr_interface_sm.c | 76 ++++----------------- source/WanManager/wanmgr_policy_auto_impl.c | 7 +- source/WanManager/wanmgr_wan_failover.c | 35 ---------- 5 files changed, 18 insertions(+), 104 deletions(-) diff --git a/source/TR-181/include/wanmgr_dml.h b/source/TR-181/include/wanmgr_dml.h index 2e2f5ad0..3fd6ee3b 100644 --- a/source/TR-181/include/wanmgr_dml.h +++ b/source/TR-181/include/wanmgr_dml.h @@ -341,7 +341,7 @@ typedef struct _WANMGR_IPV6_DATA typedef struct _WANMGR_IPV6_RA_DATA { - char defaultRoute[INET6_ADDRSTRLEN]; /**< add support for RFC7084 requirement L-13 */ + char defaultRoute[INET6_ADDRSTRLEN]; uint32_t defRouteLifeTime; } WANMGR_IPV6_RA_DATA; @@ -359,7 +359,6 @@ typedef struct _DML_WANIFACE_IP BOOL RestartConnectivityCheck; BOOL WCC_TypeChanged; // Flag to notify change in ConnectivityCheckType BOOL RefreshDHCP; - BOOL RestartV6Client; //This is a workaround to restart dhcpv6 client for the platform where PAM configures IPv6. !FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE DML_WAN_IP_MODE Mode; DML_WAN_IP_PREFERRED_MODE PreferredMode; DML_WAN_IP_PREFERRED_MODE SelectedMode; diff --git a/source/WanManager/wanmgr_data.c b/source/WanManager/wanmgr_data.c index 779ee299..8ce36773 100644 --- a/source/WanManager/wanmgr_data.c +++ b/source/WanManager/wanmgr_data.c @@ -760,7 +760,6 @@ void WanMgr_VirtIface_Init(DML_VIRTUAL_IFACE * pVirtIf, UINT iface_index) pVirtIf->EnableMAPT = FALSE; pVirtIf->EnableDSLite = FALSE; pVirtIf->IP.RefreshDHCP = FALSE; // RefreshDHCP is set when there is a change in IP source - pVirtIf->IP.RestartV6Client = FALSE; pVirtIf->Status = WAN_IFACE_STATUS_DISABLED; pVirtIf->RemoteStatus = WAN_IFACE_STATUS_DISABLED; pVirtIf->VLAN.Status = WAN_IFACE_LINKSTATUS_DOWN; diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index b34dd258..5fcbfe25 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1362,7 +1362,8 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) DML_WAN_IFACE * pInterface = pWanIfaceCtrl->pIfaceData; DML_VIRTUAL_IFACE* p_VirtIf = WanMgr_getVirtualIfaceById(pInterface->VirtIfList, pWanIfaceCtrl->VirIfIdx); -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //TODO: XB devices use the DNS of primary for backup. + //TODO: FIXME: XB devices use the DNS of primary for backup and doesn't deconfigure the primary ipv6 prefix from the LAN interface. +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) /** Reset IPv6 DNS configuration. */ if (RETURN_OK == wan_updateDNS(pWanIfaceCtrl, (p_VirtIf->IP.Ipv4Status == WAN_IFACE_IPV4_STATE_UP), FALSE)) { @@ -1374,12 +1375,12 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) ret = RETURN_ERR; } -#endif /** Unconfig IPv6. */ if ( WanManager_Ipv6AddrUtil(p_VirtIf->Name, DEL_ADDR,0,0) < 0) { AnscTraceError(("%s %d - Failed to remove inactive address \n", __FUNCTION__,__LINE__)); } +#endif // Reset sysvevents. char previousPrefix[BUFLEN_48] = {0}; @@ -1929,12 +1930,7 @@ static eWanState_t wan_transition_wan_validated(WanMgr_IfaceSM_Controller_t* pWa } if(p_VirtIf->IP.IPv6Source == DML_WAN_IP_SOURCE_DHCP && (p_VirtIf->IP.Dhcp6cPid == 0) && - (p_VirtIf->IP.Mode == DML_WAN_IP_MODE_DUAL_STACK || p_VirtIf->IP.Mode == DML_WAN_IP_MODE_IPV6_ONLY) -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - //TODO: Don't start ipv6 while validating primary for Comcast - && p_VirtIf->IP.RestartV6Client ==FALSE -#endif - ) + (p_VirtIf->IP.Mode == DML_WAN_IP_MODE_DUAL_STACK || p_VirtIf->IP.Mode == DML_WAN_IP_MODE_IPV6_ONLY)) { /* Start all interface with accept ra disbaled */ WanMgr_Configure_accept_ra(p_VirtIf, FALSE); @@ -3125,12 +3121,7 @@ static eWanState_t wan_state_obtaining_ip_addresses(WanMgr_IfaceSM_Controller_t* } if(p_VirtIf->IP.IPv6Source == DML_WAN_IP_SOURCE_DHCP && - (p_VirtIf->IP.Mode == DML_WAN_IP_MODE_IPV6_ONLY || p_VirtIf->IP.Mode == DML_WAN_IP_MODE_DUAL_STACK) -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - //TODO: Don't start ipv6 while validating primary for Comcast - && p_VirtIf->IP.RestartV6Client ==FALSE -#endif - ) + (p_VirtIf->IP.Mode == DML_WAN_IP_MODE_IPV6_ONLY || p_VirtIf->IP.Mode == DML_WAN_IP_MODE_DUAL_STACK)) { if(p_VirtIf->IP.Dhcp6cPid <= 0) { @@ -3249,30 +3240,6 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) } else if (pInterface->Selection.Status == WAN_IFACE_ACTIVE) { -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - /* This check is a workaround to reconfigure IPv6 from PAM*/ - if(p_VirtIf->IP.RestartV6Client ==TRUE) - { - CcspTraceInfo(("%s %d: Restart Ipv6 client triggered. \n", __FUNCTION__, __LINE__)); - /* Stops DHCPv6 client */ - if(p_VirtIf->IP.Dhcp6cPid > 0) - { - CcspTraceInfo(("%s %d: Stopping DHCP v6\n", __FUNCTION__, __LINE__)); - WanManager_StopDhcpv6Client(p_VirtIf->Name, STOP_DHCP_WITH_RELEASE); // release dhcp lease - p_VirtIf->IP.Dhcp6cPid = 0; - } - - if(p_VirtIf->IP.IPv6Source == DML_WAN_IP_SOURCE_DHCP && - (p_VirtIf->IP.Mode == DML_WAN_IP_MODE_DUAL_STACK || p_VirtIf->IP.Mode == DML_WAN_IP_MODE_IPV6_ONLY)) - { - /* Start DHCPv6 Client */ - p_VirtIf->IP.Dhcp6cPid = WanManager_StartDhcpv6Client(p_VirtIf, pInterface->IfaceType); - CcspTraceInfo(("%s %d - Started dhcpv6 client on interface %s, dhcpv6_pid %d \n", __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Dhcp6cPid)); - } - p_VirtIf->IP.RestartV6Client = FALSE; - } - else -#endif if (p_VirtIf->IP.Ipv6Status == WAN_IFACE_IPV6_STATE_UP) { if (p_VirtIf->IP.Ipv6Changed == TRUE) @@ -3295,6 +3262,13 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) } return ret; } + + //FIXME : IPoE health check won't work if the interface is stanby + if(p_VirtIf->IP.RestartConnectivityCheck == TRUE && p_VirtIf->IP.ConnectivityCheckType != WAN_CONNECTIVITY_TYPE_IHC) + { + WanMgr_StartConnectivityCheck(pWanIfaceCtrl); + } + return WAN_STATE_STANDBY; } @@ -3318,9 +3292,6 @@ static eWanState_t wan_state_ipv4_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC p_VirtIf->IP.Dhcp6cPid = WanManager_StartDhcpv6Client(p_VirtIf, pInterface->IfaceType); CcspTraceInfo(("%s %d - Started dhcpv6 client on interface %s, dhcpv6_pid %d \n", __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Dhcp6cPid)); CcspTraceInfo(("%s %d - Interface '%s' - Running in Dual Stack IP Mode\n", __FUNCTION__, __LINE__, pInterface->Name)); -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - p_VirtIf->IP.RestartV6Client = FALSE; -#endif } // Start DHCP apps if not started @@ -3369,29 +3340,6 @@ static eWanState_t wan_state_ipv4_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC CcspTraceError(("%s %d - Failed to tear down IPv4 for %s Interface \n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } } -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - /* This check is a workaround to reconfigure IPv6 from PAM*/ - else if(p_VirtIf->IP.RestartV6Client ==TRUE) - { - CcspTraceInfo(("%s %d: Restart Ipv6 client triggered. \n", __FUNCTION__, __LINE__)); - /* Stops DHCPv6 client */ - if(p_VirtIf->IP.Dhcp6cPid > 0) - { - CcspTraceInfo(("%s %d: Stopping DHCP v6\n", __FUNCTION__, __LINE__)); - WanManager_StopDhcpv6Client(p_VirtIf->Name, STOP_DHCP_WITH_RELEASE); - p_VirtIf->IP.Dhcp6cPid = 0; - } - - if(p_VirtIf->IP.IPv6Source == DML_WAN_IP_SOURCE_DHCP && - (p_VirtIf->IP.Mode == DML_WAN_IP_MODE_DUAL_STACK || p_VirtIf->IP.Mode == DML_WAN_IP_MODE_IPV6_ONLY)) - { - /* Start DHCPv6 Client */ - p_VirtIf->IP.Dhcp6cPid = WanManager_StartDhcpv6Client(p_VirtIf, pInterface->IfaceType); - CcspTraceInfo(("%s %d - Started dhcpv6 client on interface %s, dhcpv6_pid %d \n", __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Dhcp6cPid)); - } - p_VirtIf->IP.RestartV6Client = FALSE; - } -#endif else if (p_VirtIf->IP.Ipv6Status == WAN_IFACE_IPV6_STATE_UP) { if(p_VirtIf->IP.Ipv6Changed == TRUE) diff --git a/source/WanManager/wanmgr_policy_auto_impl.c b/source/WanManager/wanmgr_policy_auto_impl.c index 91f02feb..7154f51f 100644 --- a/source/WanManager/wanmgr_policy_auto_impl.c +++ b/source/WanManager/wanmgr_policy_auto_impl.c @@ -692,8 +692,11 @@ static WcAwPolicyState_t Transition_TryingNextInterface (WanMgr_Policy_Controlle if (pWanIfaceGroup != NULL) { //All interfaces are scanned atleast once. set InitialScanComplete to TRUE - pWanIfaceGroup->InitialScanComplete = TRUE; - CcspTraceInfo(("%s %d group(%d) Initial Scan Completed\n", __FUNCTION__, __LINE__, pWanController->GroupInst)); + if(pWanIfaceGroup->InitialScanComplete == FALSE) + { + pWanIfaceGroup->InitialScanComplete = TRUE; + CcspTraceInfo(("%s %d group(%d) Initial Scan Completed\n", __FUNCTION__, __LINE__, pWanController->GroupInst)); + } WanMgrDml_GetIfaceGroup_release(); } diff --git a/source/WanManager/wanmgr_wan_failover.c b/source/WanManager/wanmgr_wan_failover.c index 2a79fe88..07146ee0 100644 --- a/source/WanManager/wanmgr_wan_failover.c +++ b/source/WanManager/wanmgr_wan_failover.c @@ -249,38 +249,6 @@ static ANSC_STATUS WanMgr_ActivateGroup(UINT groupId) return ANSC_STATUS_SUCCESS; } -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) -/* WanMgr_SetRestartV6Client() - * Trigger the selected interface to restart IPv6 client - */ -//TODO: This is a workaround for the platforms using PAM for configuring Ipv6 -static ANSC_STATUS WanMgr_SetRestartV6Client(UINT groupId) -{ - - WANMGR_IFACE_GROUP* pWanIfaceGroup = WanMgr_GetIfaceGroup_locked((groupId - 1)); - if (pWanIfaceGroup != NULL) - { - if (pWanIfaceGroup->SelectedInterface) - { - WanMgr_Iface_Data_t* pWanDmlIfaceData = WanMgr_GetIfaceData_locked((pWanIfaceGroup->SelectedInterface - 1)); - if (pWanDmlIfaceData != NULL) - { - DML_WAN_IFACE* pWanIfaceData = &(pWanDmlIfaceData->data); - if(pWanIfaceData->VirtIfList->IP.IPv6Source == DML_WAN_IP_SOURCE_DHCP) - { - CcspTraceInfo(("%s %d Triggering RestartV6Client for %s \n", __FUNCTION__, __LINE__, pWanIfaceData->VirtIfList->Name)); - pWanIfaceData->VirtIfList->IP.RestartV6Client =TRUE; - } - WanMgrDml_GetIfaceData_release(pWanDmlIfaceData); - } - } - WanMgrDml_GetIfaceGroup_release(); - } - - return ANSC_STATUS_SUCCESS; -} -#endif - static void WanMgr_FO_IfaceGroupMonitor() { for(int i = 0; i < WanMgr_GetTotalNoOfGroups(); i++) @@ -590,9 +558,6 @@ static WcFailOverState_t Transition_ActivateGroup (WanMgr_FailOver_Controller_t //Update Telemetry if(pFailOverController->CurrentActiveGroup) { -#if !defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - WanMgr_SetRestartV6Client(pFailOverController->CurrentActiveGroup); -#endif if(pFailOverController->CurrentActiveGroup < pFailOverController->HighestValidGroup) pFailOverController->TelemetryEvent = WAN_FAILOVER_SUCCESS; else if(pFailOverController->CurrentActiveGroup > pFailOverController->HighestValidGroup) From bf284f685b691cab91ea8cff519c485fecdebbe6 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Mon, 19 Aug 2024 16:43:14 +0000 Subject: [PATCH 19/64] Fixing Connectivity check restart in standby mode Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 5fcbfe25..9edc2e3a 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -3263,8 +3263,8 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) return ret; } - //FIXME : IPoE health check won't work if the interface is stanby - if(p_VirtIf->IP.RestartConnectivityCheck == TRUE && p_VirtIf->IP.ConnectivityCheckType != WAN_CONNECTIVITY_TYPE_IHC) + //FIXME : IPoE health check won't work if the interface is standby + if(p_VirtIf->IP.RestartConnectivityCheck == TRUE && p_VirtIf->IP.ConnectivityCheckType == WAN_CONNECTIVITY_TYPE_TAD) { WanMgr_StartConnectivityCheck(pWanIfaceCtrl); } From 2ab8724e2f9113381301df8ccb6df3c0e2926b22 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Thu, 29 Aug 2024 12:13:08 +0000 Subject: [PATCH 20/64] Fixing duplicate registrtion of the remote virtual interface to rbus. Fixing Virtual interface name set. Signed-off-by: S-Parthiban-Selvaraj --- .../wanmgr_dml_iface_v2_apis.c | 10 +++- .../wanmgr_rbus_handler_apis.c | 47 +++++++++++-------- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c index 031dbe88..9eede3d8 100644 --- a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c @@ -1736,7 +1736,15 @@ BOOL WanVirtualIf_SetParamStringValue(ANSC_HANDLE hInsContext, char* ParamName, /* check the parameter name and set the corresponding value */ if (strcmp(ParamName, "Name") == 0) { - AnscCopyString(p_VirtIf->Name, pString); + /* + * TODO: Directly write to PSM. The interface state machine will read this PSM entry when initiating the WAN process. + * This is a temporary solution for devices where all interfaces share the same name. + * If interface names were unique, we could store p_VirtIf->Name instead. + */ + //AnscCopyString(p_VirtIf->Name, pString); + char param_name[512]; + snprintf(param_name, sizeof(param_name), PSM_WANMANAGER_IF_VIRIF_NAME, (p_VirtIf->baseIfIdx+1), (p_VirtIf->VirIfIdx + 1)); + WanMgr_RdkBus_SetParamValuesToDB(param_name, pString); #if defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_) WanMgr_SetRestartWanInfo(WAN_NAME_PARAM_NAME, p_VirtIf->VirIfIdx, pString); #endif diff --git a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c index 9eee39d2..27395777 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rbus_handler_apis.c @@ -1656,33 +1656,40 @@ static void CPEInterface_AsyncMethodHandler( { char AliasName[64] = {0}; snprintf(AliasName, sizeof(AliasName), "REMOTE_%s" , pValue); - strncpy( pWanIfaceData->AliasName, AliasName,sizeof(pWanIfaceData->AliasName)-1 ); - //Set Alias name of Virtual interface - strncpy( pWanIfaceData->VirtIfList->Alias, AliasName,sizeof(pWanIfaceData->VirtIfList->Alias)-1 ); - //Register the interface again if Alias changed - int rc = -1; - rc = rbusTable_registerRow(rbusHandle, WANMGR_INFACE_TABLE, (cpeInterfaceIndex+1), AliasName); - if(rc != RBUS_ERROR_SUCCESS) + if(strcmp(AliasName,pWanIfaceData->AliasName) !=0) { - CcspTraceError(("%s %d - Iterface(%d) Table (%s) Registartion failed \n", - __FUNCTION__, __LINE__, (cpeInterfaceIndex+1), WANMGR_INFACE_TABLE)); - } -#if defined(WAN_MANAGER_UNIFICATION_ENABLED) - char tmpVIfTableName[256] = {0}; - for(int VirId=0; VirId< pWanDmlIfaceData->data.NoOfVirtIfs; VirId++) - { - snprintf(tmpVIfTableName, sizeof(tmpVIfTableName), WANMGR_VIRTUAL_INFACE_TABLE_ALIAS, AliasName); - rc = rbusTable_registerRow(rbusHandle, tmpVIfTableName, (VirId+1), AliasName); //TODO: NEW_DESIGN get Alias name for virtual table + strncpy( pWanIfaceData->AliasName, AliasName,sizeof(pWanIfaceData->AliasName)-1 ); + //Set Alias name of Virtual interface + strncpy( pWanIfaceData->VirtIfList->Alias, AliasName,sizeof(pWanIfaceData->VirtIfList->Alias)-1 ); + //Register the interface again if Alias changed + char param_name[256] = {0}; + snprintf(param_name,sizeof(param_name), "%s.%d", WANMGR_INFACE_TABLE, (cpeInterfaceIndex+1)); + rbusTable_unregisterRow(rbusHandle, param_name); + + int rc = -1; + rc = rbusTable_registerRow(rbusHandle, WANMGR_INFACE_TABLE, (cpeInterfaceIndex+1), AliasName); if(rc != RBUS_ERROR_SUCCESS) { - CcspTraceError(("%s %d - VirtualInterface(%d) Table (%s) Registartion failed, Error=%d \n", __FUNCTION__, __LINE__, (VirId+1), tmpVIfTableName, rc)); + CcspTraceError(("%s %d - Iterface(%d) Table (%s) Registartion failed \n", + __FUNCTION__, __LINE__, (cpeInterfaceIndex+1), WANMGR_INFACE_TABLE)); } - else +#if defined(WAN_MANAGER_UNIFICATION_ENABLED) + char tmpVIfTableName[256] = {0}; + for(int VirId=0; VirId< pWanDmlIfaceData->data.NoOfVirtIfs; VirId++) { - CcspTraceInfo(("%s %d - VirtualInterface(%d) Table (%s) Registartion Successfully, AliasName(%s)\n", __FUNCTION__, __LINE__, (VirId+1), tmpVIfTableName, AliasName)); + snprintf(tmpVIfTableName, sizeof(tmpVIfTableName), WANMGR_VIRTUAL_INFACE_TABLE_ALIAS, AliasName); + rc = rbusTable_registerRow(rbusHandle, tmpVIfTableName, (VirId+1), AliasName); //TODO: NEW_DESIGN get Alias name for virtual table + if(rc != RBUS_ERROR_SUCCESS) + { + CcspTraceError(("%s %d - VirtualInterface(%d) Table (%s) Registartion failed, Error=%d \n", __FUNCTION__, __LINE__, (VirId+1), tmpVIfTableName, rc)); + } + else + { + CcspTraceInfo(("%s %d - VirtualInterface(%d) Table (%s) Registartion Successfully, AliasName(%s)\n", __FUNCTION__, __LINE__, (VirId+1), tmpVIfTableName, AliasName)); + } } - } #endif + } } else if( WANMGR_PHY_STATUS_CHECK ) { From f55d1b57cab52867925abce67e3054d07243a7e7 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Wed, 9 Oct 2024 09:36:08 +0000 Subject: [PATCH 21/64] Fixing IPv6 default route teardoen for Comcast Xfinity devices. Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 2 +- source/WanManager/wanmgr_net_utils.c | 5 +++-- source/WanManager/wanmgr_sysevents.c | 7 ++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index cbc88bde..aab04ffe 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1384,12 +1384,12 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) ret = RETURN_ERR; } +#endif /** Unconfig IPv6. */ if ( WanManager_Ipv6AddrUtil(p_VirtIf->Name, DEL_ADDR,0,0) < 0) { AnscTraceError(("%s %d - Failed to remove inactive address \n", __FUNCTION__,__LINE__)); } -#endif // Reset sysvevents. char previousPrefix[BUFLEN_48] = {0}; diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 4e6f3c3a..9fa82b4f 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -156,8 +156,8 @@ static ANSC_STATUS setDibblerClientEnable(BOOL * enable); ****************************************************************************/ #define SERIALIZATION_DATA "/tmp/serial.txt" static ANSC_STATUS GetAdslUsernameAndPassword(char *Username, char *Password); -static int WanManager_CalculatePsidAndV4Index(char *pdIPv6Prefix, int v6PrefixLen, int iapdPrefixLen, int v4PrefixLen, int *psidValue, int *ipv4IndexValue, int *psidLen); #endif +static int WanManager_CalculatePsidAndV4Index(char *pdIPv6Prefix, int v6PrefixLen, int iapdPrefixLen, int v4PrefixLen, int *psidValue, int *ipv4IndexValue, int *psidLen); #if defined(FEATURE_464XLAT) #define XLAT_INTERFACE "xlat" @@ -488,11 +488,12 @@ int WanManager_Ipv6AddrUtil(char *ifname, Ipv6OperType opr, int preflft, int val { if (strlen(prefix) > 0) { +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not delete prefix from LAn bridge for the comcast platforms. memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr del %s/64 dev %s", prefixAddr, IfaceName); if (WanManager_DoSystemActionWithStatus("ip -6 addr del ADDR dev xxxx", cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); - +#endif memset(cmdLine, 0, sizeof(cmdLine)); #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) snprintf(cmdLine, sizeof(cmdLine), "ip -6 route flush match %s ", prefix); diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 882accbf..0c2e382a 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -1177,6 +1177,11 @@ int Force_IPv6_toggle (char* wanInterface) return ret; } +/* + * @brief Utility function used to check the default route and send router solicit if not available. + * @param : Virtual Interface Interface . + * @return Returns NONE. + */ void WanMgr_CheckDefaultRA (DML_VIRTUAL_IFACE * pVirtIf) { char v6Toggle[BUFLEN_128] = {0}; @@ -1186,7 +1191,7 @@ void WanMgr_CheckDefaultRA (DML_VIRTUAL_IFACE * pVirtIf) if((strlen(v6Toggle) == 0) || (!strcmp(v6Toggle,"TRUE"))) { CcspTraceInfo(("%s %d SYSEVENT_IPV6_TOGGLE[TRUE] \n", __FUNCTION__, __LINE__)); - + //TODO: add check for remote device ( static ip ) if (CheckV6DefaultRule(pVirtIf->Name) == TRUE || WanManager_send_and_receive_rs(pVirtIf) == 0) { sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); From d3121320862e63bf8306abe719e96bcfca625138 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Thu, 10 Oct 2024 15:01:11 +0000 Subject: [PATCH 22/64] Fixing Virtual interface status if MAP fails( SKY requirement) Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv4_apis.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv4_apis.c b/source/WanManager/wanmgr_dhcpv4_apis.c index 3f2a12bb..31cbac52 100644 --- a/source/WanManager/wanmgr_dhcpv4_apis.c +++ b/source/WanManager/wanmgr_dhcpv4_apis.c @@ -122,7 +122,8 @@ ANSC_STATUS wanmgr_handle_dhcpv4_event_data(DML_VIRTUAL_IFACE* pVirtIf) bool IPv4ConfigChanged = FALSE; - if( strcmp(pDhcpcInfo->gateway, "0.0.0.0") == 0){ + if( strcmp(pDhcpcInfo->gateway, "0.0.0.0") == 0) + { CcspTraceInfo(("%s %d - gateway=[%s] Iface Status to VALID\n", __FUNCTION__, __LINE__, pDhcpcInfo->gateway)); if (pVirtIf->IP.pIpcIpv4Data != NULL ) { @@ -130,7 +131,12 @@ ANSC_STATUS wanmgr_handle_dhcpv4_event_data(DML_VIRTUAL_IFACE* pVirtIf) free(pVirtIf->IP.pIpcIpv4Data); pVirtIf->IP.pIpcIpv4Data = NULL; } - pVirtIf->Status = WAN_IFACE_STATUS_VALID; + + if(pVirtIf->Status != WAN_IFACE_STATUS_STANDBY && pVirtIf->Status != WAN_IFACE_STATUS_UP) + { + CcspTraceInfo(("%s %d - Setting Iface Status to VALID\n", __FUNCTION__, __LINE__, pDhcpcInfo->gateway)); + pVirtIf->Status = WAN_IFACE_STATUS_VALID; + } return ANSC_STATUS_SUCCESS; } From 2645592f7c88db42a1fd59d3c984f5bc2b82d3de Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Tue, 15 Oct 2024 10:55:56 +0000 Subject: [PATCH 23/64] RDKB-57266 : Workaround to retrieve the correct interface with an active VISM for products use the same default name for all interfaces Signed-off-by: Parthiban Selvaraj --- .../middle_layer_src/wanmgr_rdkbus_apis.c | 12 ++++ source/WanManager/wanmgr_data.c | 65 ++++++++++++++++++- source/WanManager/wanmgr_data.h | 3 +- source/WanManager/wanmgr_interface_sm.c | 23 ------- source/WanManager/wanmgr_ipc.c | 6 +- 5 files changed, 81 insertions(+), 28 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c index 77fae4d7..29efcddc 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_apis.c @@ -260,6 +260,12 @@ int get_Virtual_Interface_FromPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU pVirtIf->Enable = TRUE; } + _ansc_memset(param_name, 0, sizeof(param_name)); + _ansc_memset(param_value, 0, sizeof(param_value)); + _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, instancenum, (virtInsNum + 1)); + retPsmGet = WanMgr_RdkBus_GetParamValuesFromDB(param_name,param_value,sizeof(param_value)); + AnscCopyString(pVirtIf->Name, param_value); + _ansc_memset(param_name, 0, sizeof(param_name)); _ansc_memset(param_value, 0, sizeof(param_value)); _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_ALIAS, instancenum, (virtInsNum + 1)); @@ -521,6 +527,12 @@ int write_Virtual_Interface_ToPSM(ULONG instancenum, ULONG virtInsNum ,DML_VIRTU _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_ENABLE, instancenum, (virtInsNum + 1)); WanMgr_RdkBus_SetParamValuesToDB(param_name,param_value); + memset(param_value, 0, sizeof(param_value)); + memset(param_name, 0, sizeof(param_name)); + AnscCopyString(param_value, pVirtIf->Name); + _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, instancenum, (virtInsNum + 1)); + WanMgr_RdkBus_SetParamValuesToDB(param_name,param_value); + memset(param_value, 0, sizeof(param_value)); memset(param_name, 0, sizeof(param_name)); AnscCopyString(param_value, pVirtIf->Alias); diff --git a/source/WanManager/wanmgr_data.c b/source/WanManager/wanmgr_data.c index 8ce36773..fc331027 100644 --- a/source/WanManager/wanmgr_data.c +++ b/source/WanManager/wanmgr_data.c @@ -454,7 +454,21 @@ WanMgr_Iface_Data_t* WanMgr_GetIfaceDataByName_locked(char* iface_name) return NULL; } -DML_VIRTUAL_IFACE* WanMgr_GetVirtualIfaceByName_locked(char* iface_name) +/** + * @brief Retrieve a virtual interface object by its name with mutex locked state. + * + * This function searches all Virtual Interfaces for and returns a pointer to a virtual interface object + * identified by its name (`iface_name`). + * + * @param[in] iface_name The name of the virtual interface to retrieve. + * This should be a valid, null-terminated string. + * + * @return DML_VIRTUAL_IFACE* + * Pointer to the corresponding virtual interface structure if found, + * or NULL if not found. + */ + +DML_VIRTUAL_IFACE* WanMgr_GetVirtualIfaceByName_locked(const char* iface_name) { UINT idx; if(iface_name == NULL || strlen(iface_name) <=0) @@ -487,6 +501,55 @@ DML_VIRTUAL_IFACE* WanMgr_GetVirtualIfaceByName_locked(char* iface_name) return NULL; } +/** + * @brief Get a virtual interface by its name, ensuring the state machine is running and mutex is locked. + * + * This function searches all virtual interfaces and returns a pointer to the one matching the given name (`iface_name`), + * with the virtual interface state machine (VISM) is running. + * + * NOTE: This function is similar to WanMgr_GetVirtualIfaceByName_locked but includes an additional check to ensure + * the VISM is running. Some products use the same default name for all interfaces, causing issues with lease updates. + * This function serves as a workaround to retrieve the correct interface with an active VISM. + * + * @param[in] iface_name The name of the virtual interface to retrieve (a valid, null-terminated string). + * + * @return DML_VIRTUAL_IFACE* + * Pointer to the corresponding virtual interface if found, + * or NULL if no matching interface is found. + */ +DML_VIRTUAL_IFACE* WanMgr_GetVIfByName_VISM_running_locked(const char* iface_name) +{ + UINT idx; + if(iface_name == NULL || strlen(iface_name) <=0) + { + return NULL; + } + + if(pthread_mutex_lock(&gWanMgrDataBase.gDataMutex) == 0) + { + WanMgr_IfaceCtrl_Data_t* pWanIfaceCtrl = &(gWanMgrDataBase.IfaceCtrl); + if(pWanIfaceCtrl->pIface != NULL) + { + for(idx = 0; idx < pWanIfaceCtrl->ulTotalNumbWanInterfaces; idx++) + { + WanMgr_Iface_Data_t* pWanIfaceData = &(pWanIfaceCtrl->pIface[idx]); + DML_VIRTUAL_IFACE* virIface = pWanIfaceData->data.VirtIfList; + while(virIface != NULL) + { + if(!strcmp(iface_name,virIface->Name) && virIface->Interface_SM_Running == TRUE) + { + return virIface; + } + virIface = virIface->next; + } + } + } + WanMgrDml_GetIfaceData_release(NULL); + } + + return NULL; +} + ANSC_STATUS WanMgr_AddVirtVlanIfToList(DML_VLAN_IFACE_TABLE** head, DML_VLAN_IFACE_TABLE *newNode) { if(NULL == newNode) diff --git a/source/WanManager/wanmgr_data.h b/source/WanManager/wanmgr_data.h index 4db35ac8..9328723a 100644 --- a/source/WanManager/wanmgr_data.h +++ b/source/WanManager/wanmgr_data.h @@ -44,7 +44,8 @@ WanMgr_Iface_Data_t* WanMgr_GetIfaceData_locked(UINT iface_index); DML_VIRTUAL_IFACE* WanMgr_getVirtualIface_locked(UINT baseIfidx, UINT virtIfIdx); void WanMgr_VirtualIfaceData_release(DML_VIRTUAL_IFACE* pVirtIf); WanMgr_Iface_Data_t* WanMgr_GetIfaceDataByName_locked(char* iface_name); -DML_VIRTUAL_IFACE* WanMgr_GetVirtualIfaceByName_locked(char* iface_name); +DML_VIRTUAL_IFACE* WanMgr_GetVirtualIfaceByName_locked(const char* iface_name); +DML_VIRTUAL_IFACE* WanMgr_GetVIfByName_VISM_running_locked(const char* iface_name); void WanMgrDml_GetIfaceData_release(WanMgr_Iface_Data_t* pWanIfaceData); void WanMgr_IfaceData_Init(WanMgr_Iface_Data_t* pIfaceData, UINT uiInstNumber); ANSC_STATUS WanMgr_WanDataInit(void); diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index aab04ffe..1eb4db8a 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1715,20 +1715,6 @@ static eWanState_t wan_transition_start(WanMgr_IfaceSM_Controller_t* pWanIfaceCt CcspTraceInfo(("%s %d - Already WAN interface %s created\n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } - if(pInterface->IfaceType != REMOTE_IFACE) - { - /* TODO: This is not a right place to read the WanName from persistance memory. - * Since many platforms still use same name for all Wan Interfaces, we are updating here to make sure only the interface which is running VISM has the interface name. - */ - char param_value[256] ={0}; - char param_name[512] ={0}; - int retPsmGet = CCSP_SUCCESS; - _ansc_sprintf(param_name, PSM_WANMANAGER_IF_VIRIF_NAME, (p_VirtIf->baseIfIdx + 1), (p_VirtIf->VirIfIdx + 1)); - retPsmGet = WanMgr_RdkBus_GetParamValuesFromDB(param_name,param_value,sizeof(param_value)); - AnscCopyString(p_VirtIf->Name, (retPsmGet == CCSP_SUCCESS && (strlen(param_value) > 0 )) ? param_value: "erouter0"); - CcspTraceInfo(("%s %d VIRIF_NAME is copied from PSM. %s\n", __FUNCTION__, __LINE__, p_VirtIf->Name)); - } - /*TODO: VLAN should not be set for Remote Interface, for More info, refer RDKB-42676*/ if( p_VirtIf->VLAN.Enable == TRUE && p_VirtIf->VLAN.Status == WAN_IFACE_LINKSTATUS_DOWN && pInterface->IfaceType != REMOTE_IFACE) { @@ -2783,15 +2769,6 @@ static eWanState_t wan_transition_exit(WanMgr_IfaceSM_Controller_t* pWanIfaceCtr Update_Interface_Status(); CcspTraceInfo(("%s %d - Interface '%s' - EXITING STATE MACHINE\n", __FUNCTION__, __LINE__, pInterface->Name)); - /* TODO: This is not a right place to clear the WanName. - * Since many platforms still use same name for all Wan Interfaces, we are clearing here to make sure only the interface which is running VISM has the interface name. - */ - if(pInterface->IfaceType != REMOTE_IFACE) - { - memset(p_VirtIf->Name, 0, sizeof(p_VirtIf->Name)); - CcspTraceInfo(("%s %d clear VIRIF_NAME \n", __FUNCTION__, __LINE__)); - } - p_VirtIf->Interface_SM_Running = FALSE; return WAN_STATE_EXIT; diff --git a/source/WanManager/wanmgr_ipc.c b/source/WanManager/wanmgr_ipc.c index ec6023ee..f2ee2c0b 100644 --- a/source/WanManager/wanmgr_ipc.c +++ b/source/WanManager/wanmgr_ipc.c @@ -73,7 +73,7 @@ static ANSC_STATUS WanMgr_IpcNewIpv4Msg(ipc_dhcpv4_data_t* pNewIpv4Msg) while((retStatus != ANSC_STATUS_SUCCESS) && (try < WANMGR_MAX_IPC_PROCCESS_TRY)) { //get iface data - DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVirtualIfaceByName_locked(pNewIpv4Msg->dhcpcInterface); + DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVIfByName_VISM_running_locked(pNewIpv4Msg->dhcpcInterface); if(pVirtIf != NULL) { //check if previously message was already handled @@ -114,7 +114,7 @@ static ANSC_STATUS WanMgr_IpcNewIpv6Msg(ipc_dhcpv6_data_t* pNewIpv6Msg) while((retStatus != ANSC_STATUS_SUCCESS) && (try < WANMGR_MAX_IPC_PROCCESS_TRY)) { //get iface data - DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVirtualIfaceByName_locked(pNewIpv6Msg->ifname); + DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVIfByName_VISM_running_locked(pNewIpv6Msg->ifname); if(pVirtIf != NULL) { //check if previously message was already handled @@ -153,7 +153,7 @@ static ANSC_STATUS WanMgr_MaptStatusChanged(ipc_dhcpv6_data_t* pNewMaptMsg) CcspTraceInfo(("%s %d - Received Ipc MAMPT-Msg for %s\n", __FUNCTION__, __LINE__, pNewMaptMsg->ifname)); - DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVirtualIfaceByName_locked(pNewMaptMsg->ifname); + DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVIfByName_VISM_running_locked(pNewMaptMsg->ifname); if(pVirtIf != NULL) { if (pNewMaptMsg->maptAssigned == TRUE) From 08d79e1fb7be4b33e28c4e628c3638e89ff4fa66 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Tue, 15 Oct 2024 11:43:08 +0000 Subject: [PATCH 24/64] RDKB-57269 : Cleaning MAPT workaround added in WanUnification task Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_ipc.c | 38 ---------------------------------- 1 file changed, 38 deletions(-) diff --git a/source/WanManager/wanmgr_ipc.c b/source/WanManager/wanmgr_ipc.c index f2ee2c0b..15e1ea4c 100644 --- a/source/WanManager/wanmgr_ipc.c +++ b/source/WanManager/wanmgr_ipc.c @@ -144,34 +144,6 @@ static ANSC_STATUS WanMgr_IpcNewIpv6Msg(ipc_dhcpv6_data_t* pNewIpv6Msg) return retStatus; } -/*TODO: - *the below code should be removed once Unified MAPT Implemented. - */ -static ANSC_STATUS WanMgr_MaptStatusChanged(ipc_dhcpv6_data_t* pNewMaptMsg) -{ - ANSC_STATUS retStatus = ANSC_STATUS_FAILURE; - - CcspTraceInfo(("%s %d - Received Ipc MAMPT-Msg for %s\n", __FUNCTION__, __LINE__, pNewMaptMsg->ifname)); - - DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVIfByName_VISM_running_locked(pNewMaptMsg->ifname); - if(pVirtIf != NULL) - { - if (pNewMaptMsg->maptAssigned == TRUE) - { - WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_MAPT_START); - retStatus = ANSC_STATUS_SUCCESS; - } - else if (pNewMaptMsg->maptAssigned == FALSE) - { - WanManager_UpdateInterfaceStatus(pVirtIf, WANMGR_IFACE_MAPT_STOP); - retStatus = ANSC_STATUS_SUCCESS; - } - WanMgr_VirtualIfaceData_release(pVirtIf); - } - - return retStatus; -} - ANSC_STATUS WanMgr_SetInterfaceStatus(char *ifName, wanmgr_iface_status_t state) { DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVirtualIfaceByName_locked(ifName); @@ -351,16 +323,6 @@ static void* IpcServerThread( void *arg ) } break; #endif - /*TODO: - *The below code should be removed once Unified MAPT Implemented. - */ - case MAPT_STATE_CHANGED: - if (WanMgr_MaptStatusChanged(&(ipc_msg.data.dhcpv6)) != ANSC_STATUS_SUCCESS) - { - CcspTraceError(("[%s-%d] Failed to proccess MAPT state change message for %s \n", __FUNCTION__, __LINE__,ipc_msg.data.dhcpv6.ifname)); - } - break; - default: CcspTraceError(("[%s-%d] Invalid Message sent to Wan Manager\n", __FUNCTION__, __LINE__)); } From 0802ac5a7e2595ac3065a22ee876e5efbe5ef50e Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Tue, 15 Oct 2024 14:50:43 +0000 Subject: [PATCH 25/64] RDKB-57266 : Fixing IP.Interface Lowerlayer dml for Comcast devices Signed-off-by: S-Parthiban-Selvaraj --- source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c b/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c index 6f714802..e0a3790f 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c @@ -974,7 +974,7 @@ ANSC_STATUS WanMgr_RdkBus_setWanIpInterfaceData(DML_VIRTUAL_IFACE* pVirtIf) { retStatus = WanMgr_RdkBus_SetParamValues( PAM_COMPONENT_NAME, PAM_DBUS_PATH, dmQuery, pVirtIf->PPP.Interface, ccsp_string, TRUE ); CcspTraceInfo(("%s %d - Updating %s => %s\n", __FUNCTION__, __LINE__,dmQuery, pVirtIf->PPP.Interface)); - }else + }else if(pVirtIf->VLAN.Enable == TRUE) { retStatus = WanMgr_RdkBus_SetParamValues( PAM_COMPONENT_NAME, PAM_DBUS_PATH, dmQuery, pVirtIf->VLAN.VLANInUse, ccsp_string, TRUE ); CcspTraceInfo(("%s %d - Updating %s => %s\n", __FUNCTION__, __LINE__,dmQuery,pVirtIf->VLAN.VLANInUse)); From 9384b5a4bf728d574a6b953ffa1bf8079dbb17be Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Thu, 17 Oct 2024 16:50:40 +0000 Subject: [PATCH 26/64] Virtual interface name DML set clean up Signed-off-by: Parthiban Selvaraj --- .../TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c index 8b89404f..39a43e2b 100644 --- a/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c +++ b/source/TR-181/middle_layer_src/wanmgr_dml_iface_v2_apis.c @@ -1736,15 +1736,7 @@ BOOL WanVirtualIf_SetParamStringValue(ANSC_HANDLE hInsContext, char* ParamName, /* check the parameter name and set the corresponding value */ if (strcmp(ParamName, "Name") == 0) { - /* - * TODO: Directly write to PSM. The interface state machine will read this PSM entry when initiating the WAN process. - * This is a temporary solution for devices where all interfaces share the same name. - * If interface names were unique, we could store p_VirtIf->Name instead. - */ - //AnscCopyString(p_VirtIf->Name, pString); - char param_name[512]; - snprintf(param_name, sizeof(param_name), PSM_WANMANAGER_IF_VIRIF_NAME, (p_VirtIf->baseIfIdx+1), (p_VirtIf->VirIfIdx + 1)); - WanMgr_RdkBus_SetParamValuesToDB(param_name, pString); + AnscCopyString(p_VirtIf->Name, pString); #if defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_) WanMgr_SetRestartWanInfo(WAN_NAME_PARAM_NAME, p_VirtIf->VirIfIdx, pString); #endif From dcc453130093a3d3bcb10b3609aaf25c298debd8 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Fri, 18 Oct 2024 12:13:05 +0000 Subject: [PATCH 27/64] RDKB-57269 : MAPT handling when only IANA renewed. Fixing ipv4 DNS teardown when MAPT configured.(Comcast) Fixing Ipv4 lease time (webui) Signed-off-by: Parthiban Selvaraj --- source/TR-181/include/wanmgr_dml.h | 3 ++- source/WanManager/wanmgr_dhcpv4_apis.c | 3 ++- source/WanManager/wanmgr_dhcpv6_apis.c | 8 ++++++++ source/WanManager/wanmgr_interface_sm.c | 22 ++++++++++++---------- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/source/TR-181/include/wanmgr_dml.h b/source/TR-181/include/wanmgr_dml.h index 3fd6ee3b..da4b73a6 100644 --- a/source/TR-181/include/wanmgr_dml.h +++ b/source/TR-181/include/wanmgr_dml.h @@ -304,6 +304,7 @@ typedef struct _WANMGR_IPV4_DATA char dnsServer[BUFLEN_64]; /** New dns Server, if addressAssigned==TRUE */ char dnsServer1[BUFLEN_64]; /** New dns Server, if addressAssigned==TRUE */ uint32_t mtuSize; /** New MTU size, if mtuAssigned==TRUE */ + uint32_t leaseReceivedTime; /** Lease received time*/ #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) int32_t timeOffset; /** New time offset, if addressAssigned==TRUE */ bool isTimeOffsetAssigned; /** Is the time offset assigned ? */ @@ -312,7 +313,7 @@ typedef struct _WANMGR_IPV4_DATA uint32_t downstreamCurrRate; /** Downstream rate */ char dhcpServerId[BUFLEN_64]; /** Dhcp server id */ char dhcpState[BUFLEN_64]; /** Dhcp state. */ - uint32_t leaseTime; /** Lease time, , if addressAssigned==TRUE */ + uint32_t leaseTime; /** Lease time */ #endif } WANMGR_IPV4_DATA; diff --git a/source/WanManager/wanmgr_dhcpv4_apis.c b/source/WanManager/wanmgr_dhcpv4_apis.c index 31cbac52..d3c8c8e3 100644 --- a/source/WanManager/wanmgr_dhcpv4_apis.c +++ b/source/WanManager/wanmgr_dhcpv4_apis.c @@ -218,7 +218,7 @@ ANSC_STATUS wanmgr_handle_dhcpv4_event_data(DML_VIRTUAL_IFACE* pVirtIf) // update current IPv4 data wanmgr_dchpv4_get_ipc_msg_info(&(pVirtIf->IP.Ipv4Data), pDhcpcInfo); - + pVirtIf->IP.Ipv4Data.leaseReceivedTime = up_time; /* Assign the address to the inetrface when received. Remaining configurations are updated when activated from VISM*/ CcspTraceInfo(("%s %d - Received Ipv4 lease for interface %s. Configuring address on interface\n", __FUNCTION__, __LINE__, pVirtIf->IP.Ipv4Data.ifname)); /** Setup IPv4: such as @@ -940,6 +940,7 @@ WanMgr_DmlDhcpcGetInfo pInfo->DNSServers[0].Value = inet_addr(p_VirtIf->IP.Ipv4Data.dnsServer); pInfo->DNSServers[1].Value = inet_addr(p_VirtIf->IP.Ipv4Data.dnsServer1); pInfo->DHCPStatus = (strcmp(p_VirtIf->IP.Ipv4Data.dhcpState, DHCP_STATE_UP) == 0) ? DML_DHCPC_STATUS_Bound : DML_DHCPC_STATUS_Init; + pInfo->LeaseTimeRemaining = (p_VirtIf->IP.Ipv4Data.leaseReceivedTime + p_VirtIf->IP.Ipv4Data.leaseTime) - WanManager_getUpTime(); WanMgrDml_GetIfaceData_release(NULL); } pInfo->NumDnsServers = 2; diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 55883140..f87b63f3 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1658,6 +1658,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); pNewIpcMsg->addrAssigned = true; Ipv6DataNew.addrAssigned = true; + pNewIpcMsg->addrCmd = pDhcp6cInfoCur->addrCmd; } /* dhcp6c receives prefix delegation for LAN */ @@ -1686,6 +1687,13 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) strncpy(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataNew.pdIfAddress)); pNewIpcMsg->prefixAssigned = true; Ipv6DataNew.prefixAssigned = true; + pNewIpcMsg->prefixCmd = pDhcp6cInfoCur->prefixCmd; +#ifdef FEATURE_MAPT + //get MAP-T previous data + CcspTraceWarning(("%s %d Using previous MAPT configuration\n", __FUNCTION__, __LINE__)); + memcpy(&(pNewIpcMsg->mapt), &(pVirtIf->MAP.dhcp6cMAPTparameters), sizeof(ipc_mapt_data_t)); + pNewIpcMsg->maptAssigned = (pVirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP); +#endif } #else diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 9530aa2b..fa9a6592 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1231,21 +1231,12 @@ static int wan_tearDownIPv4(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) } #endif - /*TODO: - *Should be removed once MAPT Unified. After PandM Added V4 default route, it got deleted here. - */ -#if defined(FEATURE_SUPPORT_MAPT_NAT46) - if (p_VirtIf->EnableMAPT == FALSE) - { -#endif if (WanManager_DelDefaultGatewayRoute(DeviceNwMode, pWanIfaceCtrl->DeviceNwModeChanged, &p_VirtIf->IP.Ipv4Data) != RETURN_OK) { CcspTraceError(("%s %d - Failed to Del default system gateway", __FUNCTION__, __LINE__)); ret = RETURN_ERR; } -#if defined(FEATURE_SUPPORT_MAPT_NAT46) - } -#endif + /* ReSet the required sysevents. */ sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV4_CONNECTION_STATE, WAN_STATUS_DOWN, 0); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_CURRENT_IPV4_LINK_STATE, WAN_STATUS_DOWN, 0); @@ -2645,6 +2636,17 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface { wan_transition_ipv4_down(pWanIfaceCtrl); + /** Reset IPv4 DNS configuration. This call is to make sure IPv4 DNS is removed. **/ + if (wan_updateDNS(pWanIfaceCtrl, FALSE, TRUE) != RETURN_OK) + { + CcspTraceError(("%s %d - Failed to configure IPv6 DNS servers \n", __FUNCTION__, __LINE__)); + ret = RETURN_ERR; + } + else + { + CcspTraceInfo(("%s %d - IPv6 DNS servers configured successfully \n", __FUNCTION__, __LINE__)); + } + #if defined(FEATURE_MAPT) #if defined(IVI_KERNEL_SUPPORT) snprintf(cmdEnableIpv4Traffic,sizeof(cmdEnableIpv4Traffic),"ip ro rep default dev %s", p_VirtIf->Name); From 842125df1383415008c23f1f97a3e08a68b8ae89 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Mon, 21 Oct 2024 12:47:12 +0000 Subject: [PATCH 28/64] RDKB-57269 : Handling IPv4 DNS teardown for comcast builds. Cleaning up FEATURE_MAPT macro Adding additional comments Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv4_apis.c | 1 + source/WanManager/wanmgr_dhcpv6_apis.c | 56 ++++++++++++++++++------- source/WanManager/wanmgr_interface_sm.c | 40 ++++++------------ 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv4_apis.c b/source/WanManager/wanmgr_dhcpv4_apis.c index d3c8c8e3..af8ff2c9 100644 --- a/source/WanManager/wanmgr_dhcpv4_apis.c +++ b/source/WanManager/wanmgr_dhcpv4_apis.c @@ -132,6 +132,7 @@ ANSC_STATUS wanmgr_handle_dhcpv4_event_data(DML_VIRTUAL_IFACE* pVirtIf) pVirtIf->IP.pIpcIpv4Data = NULL; } + //Don't set the status to VALID if it is already UP or STANDBY if(pVirtIf->Status != WAN_IFACE_STATUS_STANDBY && pVirtIf->Status != WAN_IFACE_STATUS_UP) { CcspTraceInfo(("%s %d - Setting Iface Status to VALID\n", __FUNCTION__, __LINE__, pDhcpcInfo->gateway)); diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index f87b63f3..f6c526a9 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1586,6 +1586,34 @@ static ANSC_STATUS wanmgr_dchpv6_get_ipc_msg_info(WANMGR_IPV6_DATA* pDhcpv6Data, return ANSC_STATUS_SUCCESS; } +#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) +/** + * @brief Copies the previous prefix from the old IPv6 data to the new IPv6 data. + * + * This function handles the copying of IAPD details from the old data structure + * to the new one, ensuring that the previous IAPD details are used if only IANA is renewed. + * + * @param[in] pOld Pointer to the old WANMGR_IPV6_DATA structure. + * @param[in] pNew Pointer to the new WANMGR_IPV6_DATA structure. + * @return int Status code indicating success or failure. + */ +static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* pNew) +{ + if((pOld == NULL) || (pNew == NULL)) + { + return -1; + } + strncpy(pNew->sitePrefix, pOld->sitePrefix, sizeof(pNew->sitePrefix)); + strncpy(pNew->pdIfAddress, pOld->pdIfAddress, sizeof(pNew->pdIfAddress)); + memcpy(pNew->sitePrefixOld, pOld->sitePrefixOld, BUFLEN_48); + pNew->prefixAssigned = true; + pNew->prefixCmd = pOld->prefixCmd; + pNew->prefixPltime = pOld->prefixPltime; + pNew->prefixVltime = pOld->prefixVltime; + return 0; +} +#endif + ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { if(NULL == pVirtIf) @@ -1654,11 +1682,15 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } else if(pDhcp6cInfoCur->addrAssigned && Ipv6DataNew.prefixAssigned) { + /* In an IPv6 lease, both IANA and IAPD details are sent together in a struct. + * If only one of them is renewed, the other field will be set to its default value. + * In this scenario, we should not consider IANA or IAPD as deleted. + * If we reach this point, only IAPD has been renewed. Use the previous IANA details. */ + CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); - pNewIpcMsg->addrAssigned = true; Ipv6DataNew.addrAssigned = true; - pNewIpcMsg->addrCmd = pDhcp6cInfoCur->addrCmd; + Ipv6DataNew.addrCmd = pDhcp6cInfoCur->addrCmd; } /* dhcp6c receives prefix delegation for LAN */ @@ -1682,18 +1714,12 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } else if(pDhcp6cInfoCur->prefixAssigned && Ipv6DataNew.addrAssigned) { + /* In an IPv6 lease, both IANA and IAPD details are sent together in a struct. + * If only one of them is renewed, the other field will be set to its default value. + * In this scenario, we should not consider IANA or IAPD as deleted. + * If we reach this point, only IAPD has been renewed. Use the previous IAPD details. */ CcspTraceWarning(("%s %d IAPD is not assigned in this IPC msg, but we have IAPD configured from previous lease. Assuming only IANA renewed. \n", __FUNCTION__, __LINE__)); - strncpy(Ipv6DataNew.sitePrefix, pDhcp6cInfoCur->sitePrefix, sizeof(Ipv6DataNew.sitePrefix)); - strncpy(Ipv6DataNew.pdIfAddress, pDhcp6cInfoCur->pdIfAddress, sizeof(Ipv6DataNew.pdIfAddress)); - pNewIpcMsg->prefixAssigned = true; - Ipv6DataNew.prefixAssigned = true; - pNewIpcMsg->prefixCmd = pDhcp6cInfoCur->prefixCmd; -#ifdef FEATURE_MAPT - //get MAP-T previous data - CcspTraceWarning(("%s %d Using previous MAPT configuration\n", __FUNCTION__, __LINE__)); - memcpy(&(pNewIpcMsg->mapt), &(pVirtIf->MAP.dhcp6cMAPTparameters), sizeof(ipc_mapt_data_t)); - pNewIpcMsg->maptAssigned = (pVirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP); -#endif + WanMgr_CopyPreviousPrefix(pDhcp6cInfoCur, &Ipv6DataNew); } #else @@ -1803,7 +1829,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) * * use this message as a trigger to check the WAN interface IP. * * Maybe we've been assigned an address by SLAAC.*/ - if (!pNewIpcMsg->addrAssigned) + if (!Ipv6DataNew.addrAssigned) { char guAddrPrefix[IP_ADDR_LENGTH] = {0}; char guAddr[IP_ADDR_LENGTH] = {0}; @@ -1901,7 +1927,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } else { - if(pNewIpcMsg->prefixPltime != 0 && pNewIpcMsg->prefixVltime != 0) + if (pNewIpcMsg->prefixAssigned && !IS_EMPTY_STRING(pNewIpcMsg->sitePrefix) && pNewIpcMsg->prefixPltime != 0 && pNewIpcMsg->prefixVltime != 0) { #ifdef FEATURE_MAPT_DEBUG MaptInfo("--------- Got an event in Wanmanager for MAPT_STOP ---------"); diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index fa9a6592..fd4e553c 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -940,7 +940,7 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) /* TODO: the below code assumes if the LAN ipv6 address is tentaive for 15 seconds DAD has failed. Do we need additional check? * IANA dad is handled in the DHCPv6 client for the Wan Interface. * Should we remove the IP from LAN bridge and request a different Delegated prefix? - * Should we mendate EUI-64 based Interface identifiers for all platforms? + * Should we use EUI-64 based Interface identifiers for all platforms? */ for(i=0; i<15; i++) @@ -1218,8 +1218,11 @@ static int wan_tearDownIPv4(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) DML_WAN_IFACE * pInterface = pWanIfaceCtrl->pIfaceData; DML_VIRTUAL_IFACE* p_VirtIf = WanMgr_getVirtualIfaceById(pInterface->VirtIfList, pWanIfaceCtrl->VirIfIdx); -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //TODO: XB devices use the DNS of primary for backup. - /** Reset IPv4 DNS configuration. */ + /** Reset IPv4 DNS configuration. */ +#if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) + //TODO: XB devices use the DNS of primary for backup interfaces. Clear V4 DNS only if MAPT is up + if(p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) +#endif if (RETURN_OK != wan_updateDNS(pWanIfaceCtrl, FALSE, (p_VirtIf->IP.Ipv6Status == WAN_IFACE_IPV6_STATE_UP))) { CcspTraceError(("%s %d - Failed to unconfig IPv4 DNS servers \n", __FUNCTION__, __LINE__)); @@ -1229,7 +1232,6 @@ static int wan_tearDownIPv4(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) { CcspTraceInfo(("%s %d - IPv4 DNS servers unconfig successfully \n", __FUNCTION__, __LINE__)); } -#endif if (WanManager_DelDefaultGatewayRoute(DeviceNwMode, pWanIfaceCtrl->DeviceNwModeChanged, &p_VirtIf->IP.Ipv4Data) != RETURN_OK) { @@ -2590,7 +2592,6 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface DML_WAN_IFACE* pInterface = pWanIfaceCtrl->pIfaceData; DML_VIRTUAL_IFACE* p_VirtIf = WanMgr_getVirtualIfaceById(pInterface->VirtIfList, pWanIfaceCtrl->VirIfIdx); -#if defined(FEATURE_MAPT) // verify mapt configuration memset(&(p_VirtIf->MAP.MaptConfig), 0, sizeof(WANMGR_MAPT_CONFIG_DATA)); if (WanManager_VerifyMAPTConfiguration(&(p_VirtIf->MAP.dhcp6cMAPTparameters), &(p_VirtIf->MAP.MaptConfig)) == ANSC_STATUS_FAILURE) @@ -2604,7 +2605,6 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface CcspTraceInfo(("%s %d - MAPT Configuration verification success \n", __FUNCTION__, __LINE__)); } -#endif p_VirtIf->MAP.MaptChanged = FALSE; @@ -2614,14 +2614,12 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface wan_transition_ipv4_up(pWanIfaceCtrl); } -#if defined(FEATURE_MAPT) // configure mapt module ret = wan_setUpMapt(); if (ret != RETURN_OK) { CcspTraceError(("%s %d - Failed to configure MAP-T \n", __FUNCTION__, __LINE__)); } -#endif if (p_VirtIf->IP.Dhcp4cPid > 0) { @@ -2636,18 +2634,6 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface { wan_transition_ipv4_down(pWanIfaceCtrl); - /** Reset IPv4 DNS configuration. This call is to make sure IPv4 DNS is removed. **/ - if (wan_updateDNS(pWanIfaceCtrl, FALSE, TRUE) != RETURN_OK) - { - CcspTraceError(("%s %d - Failed to configure IPv6 DNS servers \n", __FUNCTION__, __LINE__)); - ret = RETURN_ERR; - } - else - { - CcspTraceInfo(("%s %d - IPv6 DNS servers configured successfully \n", __FUNCTION__, __LINE__)); - } - -#if defined(FEATURE_MAPT) #if defined(IVI_KERNEL_SUPPORT) snprintf(cmdEnableIpv4Traffic,sizeof(cmdEnableIpv4Traffic),"ip ro rep default dev %s", p_VirtIf->Name); #elif defined(NAT46_KERNEL_SUPPORT) @@ -2660,7 +2646,6 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface { CcspTraceError(("%s %d - Failed to run: %s \n", __FUNCTION__, __LINE__, cmdEnableIpv4Traffic)); } -#endif } if( p_VirtIf->PPP.Enable == TRUE ) @@ -2672,7 +2657,6 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface CcspTraceInfo(("%s %d - net.ipv4.ip_forward set to 1 \n", __FUNCTION__, __LINE__)); v_secure_system("sysctl -w net.ipv4.ip_forward=1"); -#if defined(FEATURE_MAPT) /* Configure MAPT. */ if (WanManager_ProcessMAPTConfiguration(&(p_VirtIf->MAP.dhcp6cMAPTparameters), &(p_VirtIf->MAP.MaptConfig), pInterface->Name, p_VirtIf->IP.Ipv6Data.ifname) != RETURN_OK) { @@ -2680,7 +2664,6 @@ static eWanState_t wan_transition_mapt_up(WanMgr_IfaceSM_Controller_t* pWanIface CcspTraceInfo(("%s %d - Interface '%s' - TRANSITION to State=%d \n", __FUNCTION__, __LINE__, pInterface->Name, p_VirtIf->eCurrentState)); return(p_VirtIf->eCurrentState); } -#endif sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); @@ -2703,18 +2686,19 @@ static eWanState_t wan_transition_mapt_down(WanMgr_IfaceSM_Controller_t* pWanIfa WanManager_UpdateInterfaceStatus (p_VirtIf, WANMGR_IFACE_MAPT_STOP); -#if defined(FEATURE_MAPT) - //TODO: check p_VirtIf->Status , WAN_IFACE_STATUS_UP before tearing down. - if (wan_tearDownMapt() != RETURN_OK) + if(p_VirtIf->Status == WAN_IFACE_STATUS_UP) { - CcspTraceError(("%s %d - Failed to tear down MAP-T for %s \n", __FUNCTION__, __LINE__, p_VirtIf->Name)); + if (wan_tearDownMapt() != RETURN_OK) + { + CcspTraceError(("%s %d - Failed to tear down MAP-T for %s \n", __FUNCTION__, __LINE__, p_VirtIf->Name)); + } } if (WanManager_ResetMAPTConfiguration(pInterface->Name, p_VirtIf->Name) != RETURN_OK) { CcspTraceError(("%s %d Error resetting MAP-T configuration", __FUNCTION__, __LINE__)); } -#endif + /* Clear DHCPv4 client */ WanManager_UpdateInterfaceStatus (p_VirtIf, WANMGR_IFACE_CONNECTION_DOWN); memset(&(p_VirtIf->IP.Ipv4Data), 0, sizeof(WANMGR_IPV4_DATA)); From e9d4743673414cb44c0d1c2270758dabf2197f39 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Tue, 22 Oct 2024 11:46:16 +0000 Subject: [PATCH 29/64] RDKB-57269 : Move MAPT parsing APIs to WanManager Signed-off-by: S-Parthiban-Selvaraj --- configure.ac | 12 + source/WanManager/Makefile.am | 7 + source/WanManager/MaptParsing/Makefile.am | 3 + .../WanManager/MaptParsing/cosa_mapt_apis.c | 1685 +++++++++++++++++ .../WanManager/MaptParsing/cosa_mapt_apis.h | 306 +++ 5 files changed, 2013 insertions(+) create mode 100644 source/WanManager/MaptParsing/Makefile.am create mode 100644 source/WanManager/MaptParsing/cosa_mapt_apis.c create mode 100644 source/WanManager/MaptParsing/cosa_mapt_apis.h diff --git a/configure.ac b/configure.ac index 6072d20d..fac94f2c 100644 --- a/configure.ac +++ b/configure.ac @@ -89,6 +89,18 @@ AC_ARG_ENABLE([gtestapp], [echo "Gtestapp is disabled"]) AM_CONDITIONAL([WITH_GTEST_SUPPORT], [test x$GTEST_SUPPORT_ENABLED = xtrue]) +AC_ARG_ENABLE([maptunificationsupport], + AS_HELP_STRING([--enable-maptunificationsupport],[enable mapt unification support (default is no)]), + [ + case "${enableval}" in + yes) MAPT_UNIFICATION_SUPPORT_ENABLED=true;; + no) MAPT_UNIFICATION_SUPPORT_ENABLED=false;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-maptunificationsupport ]);; + esac + ], + [echo "mapt unification is disabled"]) +AM_CONDITIONAL(MAPT_UNIFICATION_ENABLED, test "x$MAPT_UNIFICATION_SUPPORT_ENABLED" = xtrue) + dnl Checks for header files. AC_CHECK_HEADERS([limits.h memory.h stdlib.h string.h sys/socket.h unistd.h]) diff --git a/source/WanManager/Makefile.am b/source/WanManager/Makefile.am index ec96f1c7..6437c426 100644 --- a/source/WanManager/Makefile.am +++ b/source/WanManager/Makefile.am @@ -25,9 +25,16 @@ wanmanager_DEPENDENCIES = \ wanmanager_CPPFLAGS = -I$(top_srcdir)/source/TR-181/middle_layer_src \ -I$(top_srcdir)/source/TR-181/include \ + -I$(top_srcdir)/source/WanManager/MaptParsing \ -I${PKG_CONFIG_SYSROOT_DIR}$(includedir)/rbus wanmanager_CFLAGS = -DFEATURE_SUPPORT_RDKLOG $(DBUS_CFLAGS) $(SYSTEMD_CFLAGS) wanmanager_CFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\" wanmanager_SOURCES = wanmgr_webconfig_apis.c wanmgr_webconfig.c wanmgr_main.c wanmgr_ssp_action.c wanmgr_ssp_messagebus_interface.c wanmgr_core.c wanmgr_controller.c wanmgr_data.c wanmgr_sysevents.c wanmgr_interface_sm.c wanmgr_utils.c wanmgr_net_utils.c wanmgr_dhcpv4_apis.c wanmgr_dhcpv6_apis.c wanmgr_ipc.c wanmgr_dhcpv4_internal.c wanmgr_dhcpv6_internal.c wanmgr_policy_autowan_impl.c wanmgr_policy_auto_impl.c dm_pack_datamodel.c wanmgr_wan_failover.c wanmgr_policy_parallel_scan_impl.c wanmgr_dhcp_legacy_apis.c wanmanager_LDADD = $(wanmanager_DEPENDENCIES) -lccsp_common -lrdkloggers $(DBUS_LIBS) $(SYSTEMD_LDFLAGS) -lhal_platform -lapi_dhcpv4c -lnanomsg -lwebconfig_framework -lmsgpackc -ldhcp_client_utils -lprivilege -lrbus -lsecure_wrapper + + +if MAPT_UNIFICATION_ENABLED +wanmanager_SOURCES += MaptParsing/cosa_mapt_apis.c +endif + diff --git a/source/WanManager/MaptParsing/Makefile.am b/source/WanManager/MaptParsing/Makefile.am new file mode 100644 index 00000000..b179d701 --- /dev/null +++ b/source/WanManager/MaptParsing/Makefile.am @@ -0,0 +1,3 @@ +bin_PROGRAMS = wanmanager + +wanmanager_SOURCES =cosa_mapt_apis.o diff --git a/source/WanManager/MaptParsing/cosa_mapt_apis.c b/source/WanManager/MaptParsing/cosa_mapt_apis.c new file mode 100644 index 00000000..ad7abab9 --- /dev/null +++ b/source/WanManager/MaptParsing/cosa_mapt_apis.c @@ -0,0 +1,1685 @@ +/* + * If not stated otherwise in this file or this component's Licenses.txt file the + * following copyright and licenses apply: + * + * Copyright 2020 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +/********************************************************************** + Copyright [2014] [Cisco Systems, Inc.] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +**********************************************************************/ + +/************************************************************************** + + module: cosa_mapt_apis.c + + For COSA Data Model Library Development. + + ------------------------------------------------------------------- + + description: + + This file implementes back-end apis for the COSA Data Model Library + + ------------------------------------------------------------------- + + environment: + + platform independent + + ------------------------------------------------------------------- + + author: + + COSA XML TOOL CODE GENERATOR 1.0 + + ------------------------------------------------------------------- + + revision: + + 12/07/2021 initial revision. + + +**************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ccsp_psm_helper.h" +#include "ansc_platform.h" +#include +#include "ccsp_psm_helper.h" +#include "sys_definitions.h" +//#include "ccsp_custom.h" +#include "cosa_mapt_apis.h" +#include "plugin_main_apis.h" +#include "secure_wrapper.h" +#include "safec_lib_common.h" +#include "cosa_drg_common.h" +/* + * Macro definitions + */ +#define STATUS_NULL NULL +#define FIRST_BYTE(byte) (byte & 0xFF) +#define SECND_BYTE(byte) (byte & 0xFF00) +#define THIRD_BYTE(byte) (byte & 0xFF0000) +#define FORTH_BYTE(byte) (byte & 0xFF000000) + +#define RESOLV_CONF_FILE "/etc/resolv.conf" +#define RESOLV_CONF_FILE_BK "/tmp/resolv_conf.bk" + +#define SET_BIT_MASK(maskBits, shiftBits) ( \ + (ULONGLONG)(0xFFFFFFFFFFFFFFFF << (64-maskBits)) \ + >> (64-maskBits-shiftBits) \ + ) + +#define SET_RSHIFT_MASK(maskBits) ((ULONGLONG)(0xFFFFFFFFFFFFFFFF >> (64-maskBits))) + +#define STRING_TO_HEX(pStr) ( (pStr-'a'<0)? (pStr-'A'<0)? pStr-'0' : pStr-'A'+10 : pStr-'a'+10 ) + +/* + * Static function prototypes + */ +static RETURN_STATUS CosaDmlMaptApplyConfig (VOID); +static RETURN_STATUS CosaDmlMaptSetEvents (VOID); +static RETURN_STATUS CosaDmlMaptPrintConfig (VOID); +static RETURN_STATUS CosaDmlMaptResetConfig (VOID); +static RETURN_STATUS CosaDmlMaptResetClient (VOID); +static RETURN_STATUS CosaDmlMaptResetEvents (VOID); +static RETURN_STATUS CosaDmlMaptStopServices (VOID); +static RETURN_STATUS CosaDmlMaptDisplayFeatureStatus (VOID); +static RETURN_STATUS CosaDmlMaptFlushDNSv4Entries (VOID); +static RETURN_STATUS CosaDmlMaptRollback (RB_STATE eState); +static RETURN_STATUS CosaDmlMaptParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); +static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); +static RETURN_STATUS CosaDmlMaptFormulateIPv4Address (UINT32 ipv4Suffix, PCHAR pIPv4AddrString); +static RETURN_STATUS CosaDmlMaptConvertStringToHexStream (PUCHAR pOptionBuf, + PUINT16 uiOptionBufLen); +static RETURN_STATUS CosaDmlMaptFormulateIPv6Address (PCHAR pPdIPv6Prefix, PCHAR pIPv4AddrSting, + UINT16 psid, PCHAR pIPv6AddrString); +static RETURN_STATUS CosaDmlMaptComputePsidAndIPv4Suffix (PCHAR pPdIPv6Prefix, + UINT16 ui16PdPrefixLen, UINT16 ui16v6PrefixLen, UINT16 ui16v4PrefixLen, + PUINT16 pPsid, PUINT16 pPsidLen, PUINT32 pIPv4Suffix); + +static PVOID CosaDmlMaptSetUPnPIGDService (PVOID arg); + +/* + * Global definitions + */ +static COSA_DML_MAPT_DATA g_stMaptData; +static volatile UINT8 g_bEnableUPnPIGD; +static UINT8 g_bRollBackInProgress; +static UINT s_Option95CheckSum = 0; +extern ANSC_HANDLE bus_handle; + +/* + * Static function definitions + */ +static UINT +CosaDmlMaptCalculateChecksum(unsigned char *buf) +{ + unsigned int checksum = 0; + + while (*buf) { + checksum += *buf; + buf++; + } + return checksum; +} + +static RETURN_STATUS +CosaDmlMaptFormulateIPv4Address +( + UINT32 ipv4Suffix, + PCHAR pIPv4AddrString +) +{ + UCHAR ipv4AddrBytes[BUFLEN_4]; + struct in_addr ipv4Addr; + UINT32 ipv4Hex = 0; + errno_t rc = -1; + + MAPT_LOG_INFO("Entry"); + + if ( inet_pton(AF_INET, g_stMaptData.RuleIPv4Prefix, &ipv4Addr) <= 0 ) + { + MAPT_LOG_ERROR("Invalid IPv4 address = %s", g_stMaptData.RuleIPv4Prefix); + return STATUS_FAILURE; + } + + ipv4Hex = htonl(ipv4Addr.s_addr); + + *(PUINT32)ipv4AddrBytes = FIRST_BYTE((FIRST_BYTE(ipv4Hex) + FIRST_BYTE(ipv4Suffix))) + | SECND_BYTE((SECND_BYTE(ipv4Hex) + SECND_BYTE(ipv4Suffix))) + | THIRD_BYTE((THIRD_BYTE(ipv4Hex) + THIRD_BYTE(ipv4Suffix))) + | FORTH_BYTE((FORTH_BYTE(ipv4Hex) + FORTH_BYTE(ipv4Suffix))); + + rc = sprintf_s (pIPv4AddrString, BUFLEN_16, "%d.%d.%d.%d", + ipv4AddrBytes[3], ipv4AddrBytes[2], ipv4AddrBytes[1], ipv4AddrBytes[0]); + ERR_CHK(rc); + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptFormulateIPv6Address +( + PCHAR pPdIPv6Prefix, + PCHAR pIPv4AddrSting, + UINT16 psid, + PCHAR pIPv6AddrString +) +{ + UCHAR ipv4AddrBytes[BUFLEN_4]; + struct in6_addr ipv6Addr; + struct in_addr ipv4Addr; + UINT32 ipv4Hex = 0; + errno_t rc = -1; + + MAPT_LOG_INFO("Entry"); + + if ( inet_pton(AF_INET, pIPv4AddrSting, &ipv4Addr) <= 0) + { + MAPT_LOG_ERROR("Invalid IPv4 address = %s", pIPv4AddrSting); + return STATUS_FAILURE; + } + + ipv4Hex = htonl(ipv4Addr.s_addr); + + *(PUINT32)ipv4AddrBytes = FIRST_BYTE(ipv4Hex) + | SECND_BYTE(ipv4Hex) + | THIRD_BYTE(ipv4Hex) + | FORTH_BYTE(ipv4Hex); + + if ( inet_pton(AF_INET6, pPdIPv6Prefix, &ipv6Addr) <= 0) + { + MAPT_LOG_ERROR("Invalid IPv6 address = %s", pPdIPv6Prefix); + return STATUS_FAILURE; + } + + rc = sprintf_s (pIPv6AddrString, BUFLEN_40, + "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", + ipv6Addr.s6_addr[0], ipv6Addr.s6_addr[1], ipv6Addr.s6_addr[2], ipv6Addr.s6_addr[3], + ipv6Addr.s6_addr[4], ipv6Addr.s6_addr[5], ipv6Addr.s6_addr[6], ipv6Addr.s6_addr[7], + 0x0, 0x0, ipv4AddrBytes[3], ipv4AddrBytes[2], ipv4AddrBytes[1], ipv4AddrBytes[0], + SECND_BYTE(psid)>>8, FIRST_BYTE(psid)); + ERR_CHK(rc); + + MAPT_LOG_INFO("IPv6AddrString is : %s", pIPv6AddrString); + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptGetIPv6StringFromHex +( + PUCHAR pIPv6AddrH, + PCHAR pIPv6AddrS +) +{ + errno_t rc = -1; + MAPT_LOG_INFO("Entry"); + + if ( !(pIPv6AddrH && pIPv6AddrS) ) + { + MAPT_LOG_ERROR("NULL inputs(%s - %s) for IPv6 hex to string conversion!", + pIPv6AddrH, pIPv6AddrS); + return STATUS_FAILURE; + } + + rc = memset_s (pIPv6AddrS, BUFLEN_40, 0, BUFLEN_40); + ERR_CHK(rc); + + if ( !inet_ntop(AF_INET6, pIPv6AddrH, pIPv6AddrS, BUFLEN_40) ) + { + MAPT_LOG_ERROR("Invalid IPv6 hex address"); + return STATUS_FAILURE; + } + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptApplyConfig +( + VOID +) +{ + MAPT_LOG_INFO("Entry"); +#if defined (_COSA_BCM_ARM_) && defined (_XB6_PRODUCT_REQ_) + if ( access("/proc/sys/net/flowmgr/disable_mapt_accel", F_OK) ) + { + MAPT_LOG_ERROR("Mapt packet acceleration not supported!"); + } else if ( v_secure_system("echo 0 > /proc/sys/net/flowmgr/disable_mapt_accel") ) + { + MAPT_LOG_ERROR("Failed to enable mapt packet acceleration!"); + } +#endif + + if ( v_secure_system("insmod /lib/modules/`uname -r`/extra/nat46.ko zero_csum_pass=1") ) + { + MAPT_LOG_ERROR("Failed to load nat46 module!"); + return STATUS_FAILURE; + } + + if ( v_secure_system("echo add %s > /proc/net/nat46/control", MAPT_INTERFACE) ) + { + MAPT_LOG_ERROR("Failed to add %s iface in nat46 module!", MAPT_INTERFACE); + return STATUS_FAILURE; + } + + if ( v_secure_system("echo config %s local.v4 %s/%d local.v6 %s/%d " + "local.style MAP local.ea-len %d local.psid-offset %d " + "remote.v4 0.0.0.0/0 remote.v6 %s/%d remote.style RFC6052 " + "remote.ea-len 0 remote.psid-offset 0 debug 0 " + "local.pd %s/%d > /proc/net/nat46/control", + MAPT_INTERFACE, + g_stMaptData.RuleIPv4Prefix, g_stMaptData.RuleIPv4PrefixLen, + g_stMaptData.RuleIPv6Prefix, g_stMaptData.RuleIPv6PrefixLen, + g_stMaptData.EaLen, g_stMaptData.PsidOffset, + g_stMaptData.BrIPv6Prefix, g_stMaptData.BrIPv6PrefixLen, + g_stMaptData.PdIPv6Prefix, g_stMaptData.PdIPv6PrefixLen) ) + { + MAPT_LOG_ERROR("Failed to configure map0 iface!"); + return STATUS_FAILURE; + } + MAPT_LOG_INFO("Nat46 module loaded and configured successfully."); + + if ( v_secure_system("ip link set %s up", MAPT_INTERFACE) ) + { + MAPT_LOG_ERROR("Failed to set %s link up!", MAPT_INTERFACE); + return STATUS_FAILURE; + } + + if ( v_secure_system("ip route del default") ) + { + MAPT_LOG_WARNING("Failed to delete default route!"); + } + + if ( v_secure_system("ip ro rep default dev %s mtu %s", MAPT_INTERFACE , MAPT_V4_MTU_SIZE) ) + { + MAPT_LOG_ERROR("Failed to set %s as default route!", MAPT_INTERFACE); + return STATUS_FAILURE; + } + + if ( v_secure_system("ip link set dev %s mtu %s", MAPT_INTERFACE, MAPT_MTU_SIZE) ) + { + MAPT_LOG_ERROR("Failed to set mtu %s on %s!", MAPT_MTU_SIZE, MAPT_INTERFACE); + return STATUS_FAILURE; + } + + if ( v_secure_system("ip -6 route add %s dev %s metric 256 mtu %s", + g_stMaptData.IPv6AddrString, MAPT_INTERFACE, MAPT_MTU_SIZE) ) + { + MAPT_LOG_ERROR("Failed to add %s route on %s!", + g_stMaptData.IPv6AddrString, MAPT_INTERFACE); + return STATUS_FAILURE; + } + MAPT_LOG_INFO("Ip routes modified successfully."); + + // override udp timeout for mapt + if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout=30") ) + { + MAPT_LOG_ERROR("Failed to set nf_conntrack_udp_timeout!"); + } + + if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=30") ) + { + MAPT_LOG_ERROR("Failed to set nf_conntrack_udp_timeout_stream!"); + } + + return STATUS_SUCCESS; +} + + +static PVOID +CosaDmlMaptSetUPnPIGDService +( + PVOID arg +) +{ + INT size = 0; + INT ret = CCSP_FAILURE; + extern CHAR g_Subsystem[BUFLEN_32]; + CHAR dst_pathname_cr[BUFLEN_64] = {0}; + errno_t safec_ret = -1; + PCHAR faultParam = NULL; + componentStruct_t** ppComponents = NULL; + parameterValStruct_t value = {"Device.UPnP.Device.UPnPIGD", + (PCHAR)arg, + ccsp_boolean}; + + CCSP_MESSAGE_BUS_INFO *bus_info = (CCSP_MESSAGE_BUS_INFO *)bus_handle; + + pthread_detach(pthread_self()); + + safec_ret = sprintf_s(dst_pathname_cr, sizeof(dst_pathname_cr), "%s%s", g_Subsystem, CCSP_DBUS_INTERFACE_CR); + ERR_CHK(safec_ret); + + ret = CcspBaseIf_discComponentSupportingNamespace(bus_handle + , dst_pathname_cr + , value.parameterName + , g_Subsystem + , &ppComponents + , &size); + + if ( ret != CCSP_SUCCESS || size != 1 ) { + MAPT_LOG_ERROR("Error: '%s' does not exist|size:%d", value.parameterName, size); + return STATUS_NULL; + } + + ret = CcspBaseIf_setParameterValues(bus_handle + , ppComponents[0]->componentName + , ppComponents[0]->dbusPath + , 0 + , 0 + , (PVOID)&value + , 1 + , TRUE + , &faultParam); + + if ( CCSP_SUCCESS != ret ) + { + MAPT_LOG_ERROR("CcspBaseIf set param failed! ret %d", ret); + if ( faultParam ) + { + bus_info->freefunc(faultParam); + } + return STATUS_NULL; + } + free_componentStruct_t(bus_handle, 1, ppComponents); + + { + INT cResult = -1; + + safec_ret = strcmp_s((PCHAR)arg, strlen((PCHAR)arg), "true", &cResult); + ERR_CHK(safec_ret); + + if ( !safec_ret && !cResult ) + { + g_bEnableUPnPIGD = 0; + MAPT_LOG_INFO("### Mapt UPnP_IGD service reset."); + } + else + { + g_bEnableUPnPIGD = 1; + } + } + + return STATUS_NULL; +} + + +static RETURN_STATUS +CosaDmlMaptFlushDNSv4Entries +( + VOID +) +{ + /* Flush v4 DNS enteries from resolv conf */ + if ( !access(RESOLV_CONF_FILE, F_OK) ) + { + struct in_addr ipv4Addr; + FILE* fp = NULL; + FILE* tp = NULL; + UINT8 overWrite = 0; + INT32 ret = -1; + INT32 resComp = -1; + CHAR nmSrv[BUFLEN_32] = {0}; + CHAR dnsIP[BUFLEN_64] = {0}; + CHAR leftOut[BUFLEN_128] = {0}; + + if ( !(fp = fopen(RESOLV_CONF_FILE, "r")) ) + { + MAPT_LOG_ERROR("Error opening %s ", RESOLV_CONF_FILE); + return STATUS_FAILURE; + } + + if ( !(tp = fopen(RESOLV_CONF_FILE_BK, "w")) ) + { + MAPT_LOG_ERROR("Error opening %s", RESOLV_CONF_FILE_BK); + /* CID 277328 fix */ + fclose(fp); + return STATUS_FAILURE; + } + + MAPT_LOG_INFO("#### Remove DNS Entries ####"); + while (memset(nmSrv, 0, sizeof(nmSrv)), + memset(dnsIP, 0, sizeof(dnsIP)), + memset(leftOut, 0, sizeof(leftOut)), + /* CID 277314 Calling risky function fix : Use correct precision specifiers */ + fscanf(fp, "%31s %63s%127[^\n]s\n", nmSrv, dnsIP, leftOut) != EOF) + { + ret = strcmp_s(nmSrv, sizeof(nmSrv), "nameserver", &resComp); + ERR_CHK(ret); + + if ( !ret && !resComp ) + { + if ( inet_pton(AF_INET, dnsIP, &ipv4Addr) > 0 ) + { + MAPT_LOG_INFO("DEL %s", dnsIP); + overWrite = 1; + continue; + } + } + fprintf(tp, "%s %s%s\n", nmSrv, dnsIP, leftOut); + } + MAPT_LOG_INFO("############################"); + + fclose(tp); + fclose(fp); + + if ( overWrite ) + { + char buf[BUFLEN_256] = {0}; + + if ( !(fp = fopen(RESOLV_CONF_FILE, "w")) || + !(tp = fopen(RESOLV_CONF_FILE_BK, "r"))) + { + MAPT_LOG_ERROR("Copy failed %s -> %s", RESOLV_CONF_FILE, RESOLV_CONF_FILE_BK); + /* CID 277328 fix - Resource Leak */ + if(fp != NULL) + fclose(fp); + return STATUS_FAILURE; + } + + while (fgets(buf, sizeof(buf), tp)) + { + fputs(buf, fp); + } + + fclose(tp); + fclose(fp); + } + + if ( remove(RESOLV_CONF_FILE_BK) ) + { + MAPT_LOG_WARNING("Couldn't remove file: %s", RESOLV_CONF_FILE_BK); + } + } + else + { + MAPT_LOG_ERROR("File not found: %s", RESOLV_CONF_FILE); + return STATUS_FAILURE; + } + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptStopServices +( + VOID +) +{ + char eth_wan_enable_flag[BUFLEN_8] = {0}; + int strcmp_ret = -1; + errno_t rc = -1; + + /* Bring down DHCPv4 client */ + if ( v_secure_system("service_wan dhcp-release") ) + { + MAPT_LOG_ERROR("Wan Dhcp Release Failed !!"); + } + if ( v_secure_system("service_wan dhcp-stop") ) + { + MAPT_LOG_ERROR("Wan Dhcp Stop Failed !!"); + } + + commonSyseventSet ("current_wan_ipaddr", "0.0.0.0"); + /* Try validating the service stop. status may be? */ + MAPT_LOG_INFO("DHCPv4 client is made down."); + + /* FIXME: Issue in DNS ipv6 resolution when ethwan enabled */ + /* Workaround: We keep the ipv4 entries for name resolution */ + if (0 == syscfg_get(NULL, "eth_wan_enabled", eth_wan_enable_flag, sizeof(eth_wan_enable_flag))) + { + rc = strcmp_s(eth_wan_enable_flag, 5, "false", &strcmp_ret); + ERR_CHK(rc); + if (0 == strcmp_ret) + { + /* Better to have this done in service_wan generically. + * For now we will live with this, as this is required + * for MAPT devices. + */ + if ( CosaDmlMaptFlushDNSv4Entries() != STATUS_SUCCESS) + { + MAPT_LOG_ERROR("Failed to flush DNS v4 nameservers!"); + } + } + else + { + MAPT_LOG_INFO("Ethwan mode , bypassing CosaDmlMaptFlushDNSv4Entries()"); + } + } + /* Stopping UPnP, if mapt ratio is not 1:1 */ + if ( g_stMaptData.Ratio > 1 ) + { + CHAR isEnabled[BUFLEN_4] = {0}; + + if ( !syscfg_get(NULL, SYSCFG_UPNP_IGD_ENABLED, isEnabled, sizeof(isEnabled)) + && isEnabled[0] == '1') + { + pthread_t th_id; + MAPT_LOG_INFO("Stopping UPnP_IGD service, as MAPT ratio is higher"); + + if ( pthread_create(&th_id, NULL, &CosaDmlMaptSetUPnPIGDService, (PVOID)"false") ) + { + MAPT_LOG_ERROR("pthread create Failed, to stop UPnP_IGD Service!"); + } + } + } + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptSetEvents +( + VOID +) +{ + CHAR eValue[BUFLEN_128] = {0}; + INT32 ret = 0; + errno_t rc = -1; + + MAPT_LOG_INFO("Entry"); + + ret |= commonSyseventSet (EVENT_MAPT_TRANSPORT_MODE, "MAPT"); + MAPT_LOG_NOTICE("MAP_MODE: MAPT"); + + ret |= commonSyseventSet (EVENT_MAPT_CONFIG_FLAG, "set"); + + rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.EaLen); + ERR_CHK(rc); + ret |= commonSyseventSet(EVENT_MAPT_EA_LENGTH, eValue); + + rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.Ratio); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_RATIO, eValue); + + rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.Psid); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_PSID_VALUE, eValue); + + rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.PsidLen); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_PSID_LENGTH, eValue); + + rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.PsidOffset); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_PSID_OFFSET, eValue); + + ret |= commonSyseventSet (EVENT_MAPT_IPADDRESS, g_stMaptData.IPv4AddrString); + + ret |= commonSyseventSet (EVENT_MAPT_IPV6_ADDRESS, g_stMaptData.IPv6AddrString); + + rc = sprintf_s(eValue, BUFLEN_128, "%s/%u", g_stMaptData.BrIPv6Prefix + , g_stMaptData.BrIPv6PrefixLen); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_BR_IPV6_PREFIX, eValue); + + rc = sprintf_s(eValue, BUFLEN_128, "%s/%u", g_stMaptData.RuleIPv4Prefix + , g_stMaptData.RuleIPv4PrefixLen); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_RULE_IPADDRESS, eValue); + + rc = sprintf_s(eValue, BUFLEN_128, "%s/%u", g_stMaptData.RuleIPv6Prefix + , g_stMaptData.RuleIPv6PrefixLen); + ERR_CHK(rc); + ret |= commonSyseventSet (EVENT_MAPT_RULE_IPV6_ADDRESS, eValue); + ret |= commonSyseventSet(EVENT_MAPT_IS_FMR, g_stMaptData.bFMR?"TRUE":"FALSE"); + + return ret? STATUS_FAILURE : STATUS_SUCCESS; +} + +/* + : : ___/ : + | p bits | / q bits : + +-----------+ +------------+ + |IPv4 suffix| |Port Set ID | + +-----------+ +------------+ + \ / ____/ ________/ + \ : __/ _____/ + \ : / / + | n bits | o bits | s bits | 128-n-o-s bits | + +--------------------+-----------+---------+------------+----------+ + | Rule IPv6 prefix | EA bits |subnet ID| interface ID | + +--------------------+-----------+---------+-----------------------+ + |<--- End-user IPv6 prefix --->| + +EA-bits: ++-------------------+---------+ +|IPV4 Address Suffix| PSID | ++-------------------+---------+ +|--------p----------|----q----+ +|--------------o--------------| +*/ + +static RETURN_STATUS +CosaDmlMaptComputePsidAndIPv4Suffix +( + PCHAR pPdIPv6Prefix, + UINT16 ui16PdPrefixLen, + UINT16 ui16v6PrefixLen, + UINT16 ui16v4PrefixLen, + PUINT16 pPsid, + PUINT16 pPsidLen, + PUINT32 pIPv4Suffix +) +{ + UINT8 ui8v4BitIdxLen = 0, ui8PsidBitIdxLen = 0, ui8EaStartByteSetBits = 0; + UINT8 ui8EaLen = 0, ui8EaStartByte = 0, ui8EaLastByte = 0; + ULONG ulEaBytes = 0; + struct in6_addr ipv6Addr; + + MAPT_LOG_INFO("Entry"); + + // V4 suffix bits length + ui8v4BitIdxLen = BUFLEN_32 - ui16v4PrefixLen; + + // EA bits length + ui8EaLen = ui16PdPrefixLen - ui16v6PrefixLen; + + // PSID length + ui8PsidBitIdxLen = ui8EaLen - ui8v4BitIdxLen; + + MAPT_LOG_INFO("<<>> ui8v4BitIdxLen(IPV4 Suffix Bits): %u", ui8v4BitIdxLen); + MAPT_LOG_INFO("<<>> ui8EaLen (EA bits) : %u", ui8EaLen); + MAPT_LOG_INFO("<<>> ui8PsidBitIdxLen(PSID length) : %u", ui8PsidBitIdxLen); + + if (ui8EaLen != g_stMaptData.EaLen) + { + MAPT_LOG_INFO("Calculated EA-bits and received MAP EA-bits does not match!"); + return STATUS_FAILURE; + } + + if ( ui16PdPrefixLen < ui16v6PrefixLen ) + { + MAPT_LOG_ERROR("Invalid MAPT option, ui16PdPrefixLen(%d) < ui16v6PrefixLen(%d)", + ui16PdPrefixLen, ui16v6PrefixLen); + return STATUS_FAILURE; + } + + if ( inet_pton(AF_INET6, pPdIPv6Prefix, &ipv6Addr) <= 0 ) + { + MAPT_LOG_ERROR("Invalid IPv6 address = %s", pPdIPv6Prefix); + return STATUS_FAILURE; + } + + if ( ui8EaLen ) + { + UINT8 idx = 0; + ui8EaStartByte = ui16v6PrefixLen / 8; + ui8EaLastByte = ui8EaStartByte + ui8EaLen/8 + ((ui8EaLen % 8)?1:0); + ui8EaStartByteSetBits = ui16v6PrefixLen % 8; + + MAPT_LOG_INFO("<<>> ui8EaStartByte : %u", ui8EaStartByte); + MAPT_LOG_INFO("<<>> ui8EaLastByte : %u", ui8EaLastByte); + MAPT_LOG_INFO("<<>> ui8EaStartByteSetBits : %u", ui8EaStartByteSetBits); + + /* Extracting ui8EaLen/8 bytes of EA bits from Pd IPv6 prefix */ + do + { + ulEaBytes = ulEaBytes << 8 | ipv6Addr.s6_addr[ui8EaStartByte + idx]; + } while (idx++, (idx < (ui8EaLastByte - ui8EaStartByte))); + + MAPT_LOG_INFO("<<>> No.of bytes extracted: %d, ulEaBytes: 0x%lX", idx, ulEaBytes); + + // If prefix is not aa multiple of 8, get the extra byte and extract the bits + if ( ui8EaStartByteSetBits ) + { + MAPT_LOG_INFO("MAP V6 Prefix not in multiples of 8, Prefix = %d", ui16v6PrefixLen); + ulEaBytes <<= 8; + ulEaBytes |= (ipv6Addr.s6_addr[ui8EaLastByte]); + + // push the extra bits out from the last byte + ulEaBytes >>= (((ui8EaLastByte - ui8EaStartByte) * 8 - ui8EaLen) + (8-ui8EaStartByteSetBits)); + + // clear the extra bits from the first EA byte + ulEaBytes = (ulEaBytes & SET_RSHIFT_MASK(ui8EaLen)); + + MAPT_LOG_INFO("<<>> ulEaBytes: 0x%lX", ulEaBytes); + } + else + { + // push the extra bits out from the last byte + ulEaBytes = (ulEaBytes >> (((ui8EaLastByte-ui8EaStartByte)*8) - ui8EaLen)); + MAPT_LOG_INFO("<<>> ulEaBytes: 0x%lX\n", ulEaBytes); + } + + // p-bits + *pIPv4Suffix = (ulEaBytes >> ui8PsidBitIdxLen) & SET_RSHIFT_MASK(ui8v4BitIdxLen); + + // q-bits + *pPsid = (ulEaBytes & (SET_RSHIFT_MASK(ui8PsidBitIdxLen))); + *pPsidLen = ui8PsidBitIdxLen; + } + + MAPT_LOG_INFO("IPv4Suffix: %u | Psid: %u | Psidlen: %u",*pIPv4Suffix, *pPsid, *pPsidLen); + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptParseResponse +( + PUCHAR pOptionBuf, + UINT16 uiOptionBufLen +) +{ + RETURN_STATUS retStatus = STATUS_SUCCESS; + PCOSA_DML_MAPT_OPTION pStartBuf = NULL; + PCOSA_DML_MAPT_OPTION pNxtOption = NULL; + PCOSA_DML_MAPT_OPTION pEndBuf = NULL; + UINT16 uiOptionLen = 0; + UINT16 uiOption = 0; + PUCHAR pCurOption = 0; + errno_t rc = -1; + + MAPT_LOG_INFO("Entry"); + + if ( !(pOptionBuf && *(pOptionBuf+1)) ) + { + MAPT_LOG_ERROR("MAPT Option-95 Response is NULL !!"); + return STATUS_FAILURE; + } + + pStartBuf = (PCOSA_DML_MAPT_OPTION)pOptionBuf; + pEndBuf = (PCOSA_DML_MAPT_OPTION)((PCHAR)pOptionBuf + uiOptionBufLen); +MAPT_LOG_INFO("<<>> Start : %p | End : %p", pStartBuf,pEndBuf); + for ( ;pStartBuf + 1 <= pEndBuf; pStartBuf = pNxtOption ) + { + uiOptionLen = ntohs(pStartBuf->OptLen); + uiOption = ntohs(pStartBuf->OptType); + + pCurOption = (PUCHAR)(pStartBuf + 1); + pNxtOption = (PCOSA_DML_MAPT_OPTION)(pCurOption + uiOptionLen); +MAPT_LOG_INFO("<<>> Cur : %p | Nxt : %p", pCurOption,pNxtOption); +MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); + + /* option length field overrun */ + if ( pNxtOption > pEndBuf ) + { + MAPT_LOG_ERROR("Malformed MAP options!"); + retStatus = STATUS_FAILURE; //STATUS_BAD_PAYLOAD + break; + } + + switch ( uiOption ) + { + case MAPT_OPTION_S46_RULE: + { + UINT8 bytesLeftOut = 0; + UINT8 v6ByteLen = 0; + UINT8 v6BitLen = 0; + UCHAR v6Addr[BUFLEN_24]; + + g_stMaptData.bFMR = (*pCurOption & 0x01)? TRUE : FALSE; + g_stMaptData.EaLen = *++pCurOption; + g_stMaptData.RuleIPv4PrefixLen = *++pCurOption; + pCurOption++; + + rc = sprintf_s (g_stMaptData.RuleIPv4Prefix, sizeof(g_stMaptData.RuleIPv4Prefix), + "%d.%d.%d.%d", + pCurOption[0], pCurOption[1], pCurOption[2], pCurOption[3]); + ERR_CHK(rc); + + g_stMaptData.RuleIPv6PrefixLen = *(pCurOption += 4); + v6ByteLen = g_stMaptData.RuleIPv6PrefixLen / 8; + v6BitLen = g_stMaptData.RuleIPv6PrefixLen % 8; + pCurOption++; + + rc = memset_s (&v6Addr, BUFLEN_24, 0, sizeof(v6Addr)); + ERR_CHK(rc); + rc = memcpy_s (&v6Addr, BUFLEN_24, pCurOption, + (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); + ERR_CHK(rc); + + if ( v6BitLen ) + { + *((PCHAR)&v6Addr + v6ByteLen) &= 0xFF << (8 - v6BitLen); + } + + rc = memcpy_s (&g_stMaptData.RuleIPv6PrefixH, BUFLEN_24, v6Addr, + (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); + ERR_CHK(rc); + CosaDmlMaptGetIPv6StringFromHex (g_stMaptData.RuleIPv6PrefixH, + g_stMaptData.RuleIPv6Prefix); +MAPT_LOG_INFO("<<>> g_stMaptData.bFMR : %d", g_stMaptData.bFMR); +MAPT_LOG_INFO("<<>> g_stMaptData.EaLen : %u", g_stMaptData.EaLen); +MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4PrefixLen : %u", g_stMaptData.RuleIPv4PrefixLen); +MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4Prefix : %s", g_stMaptData.RuleIPv4Prefix); +MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6PrefixLen : %u", g_stMaptData.RuleIPv6PrefixLen); +MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6Prefix : %s", g_stMaptData.RuleIPv6Prefix); + MAPT_LOG_INFO("Parsing OPTION_S46_RULE Successful."); + + /* + * check port parameter option: + * prefix6_len, located at 8th byte in rule option, specifies + * the length of following v6prefix. So the length of port + * param option, if any, must be rule_opt_len minus 8 minus v6ByteLen minus (1 or 0) + */ + bytesLeftOut = uiOptionLen - 8 - v6ByteLen - (v6BitLen?1:0); + + g_stMaptData.Ratio = 1 << (g_stMaptData.EaLen - + (BUFLEN_32 - g_stMaptData.RuleIPv4PrefixLen)); + /* RFC default */ + g_stMaptData.PsidOffset = 6; +MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); +MAPT_LOG_INFO("<<>> bytesLeftOut : %u", bytesLeftOut); + if ( bytesLeftOut > 0 ) + { + /* this rule option includes port param option */ + if ( bytesLeftOut == 8 ) // Only support one port param option per rule option + { + UINT16 uiSubOptionLen = 0; + UINT16 uiSubOption = 0; + + pCurOption += v6ByteLen + (v6BitLen?1:0); + uiSubOptionLen = ntohs(((PCOSA_DML_MAPT_OPTION)pCurOption)->OptLen); + uiSubOption = ntohs(((PCOSA_DML_MAPT_OPTION)pCurOption)->OptType); + + if ( uiSubOption == MAPT_OPTION_S46_PORT_PARAMS && + uiSubOptionLen == 4 ) + { + g_stMaptData.PsidOffset = (*(pCurOption += uiSubOptionLen))? + *pCurOption:6; + g_stMaptData.PsidLen = *++pCurOption; + + if ( !g_stMaptData.EaLen ) + { + g_stMaptData.Ratio = 1 << g_stMaptData.PsidLen; + } + /* + * RFC 7598: 4.5: 16 bits long. The first k bits on the left of + * this field contain the PSID binary value. The remaining (16 - k) + * bits on the right are padding zeros. + */ + g_stMaptData.Psid = ntohs(*((PUINT16)++pCurOption)) >> + (16 - g_stMaptData.PsidLen); +MAPT_LOG_INFO("<<>> g_stMaptData.Psid : %u", g_stMaptData.Psid); +MAPT_LOG_INFO("<<>> g_stMaptData.PsidLen : %u", g_stMaptData.PsidLen); +MAPT_LOG_INFO("<<>> g_stMaptData.PsidOffset : %u", g_stMaptData.PsidOffset); +MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); + MAPT_LOG_INFO("Parsing OPTION_S46_PORT_PARAM Successful."); + } + else + { + MAPT_LOG_WARNING("OPTION_S46_PORT_PARAM option length(%d) varies!" + , uiSubOptionLen); + } + } + else + { + MAPT_LOG_WARNING("Port param option length(%d) not equal to 8" + , bytesLeftOut); + } + } + break; + } + + case MAPT_OPTION_S46_BR: + { + MAPT_LOG_WARNING("Parsing OPTION_S46_BR is not supported !"); + //retStatus = STATUS_NOT_SUPPORTED; + break; + } + + case MAPT_OPTION_S46_DMR: + { + UCHAR ipv6Addr[BUFLEN_24]; + + g_stMaptData.BrIPv6PrefixLen = *pCurOption++; + + /* RFC 6052: 2.2: g_stMaptData.BrIPv6PrefixLen%8 must be 0! */ + rc = memset_s (&ipv6Addr, BUFLEN_24, 0, sizeof(ipv6Addr)); + ERR_CHK(rc); + rc = memcpy_s (&ipv6Addr, BUFLEN_24, pCurOption, g_stMaptData.BrIPv6PrefixLen/8); + ERR_CHK(rc); + + CosaDmlMaptGetIPv6StringFromHex (ipv6Addr, g_stMaptData.BrIPv6Prefix); +MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6PrefixLen : %u", g_stMaptData.BrIPv6PrefixLen); +MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6Prefix : %s", g_stMaptData.BrIPv6Prefix); + MAPT_LOG_INFO("Parsing OPTION_S46_DMR Successful."); + break; + } + + default: + MAPT_LOG_ERROR("Unknown or unexpected MAP option : %d | option len : %d" + , uiOption, uiOptionLen); + //retStatus = STATUS_NOT_SUPPORTED; + break; + } + } + + /* Check a parameter from each mandatory options */ + if ( !g_stMaptData.RuleIPv6PrefixLen || !g_stMaptData.BrIPv6PrefixLen) + { + MAPT_LOG_ERROR("Mandatory mapt options are missing !"); + retStatus = STATUS_FAILURE; + } + + return retStatus; +} + + +static RETURN_STATUS +CosaDmlMaptPrintConfig +( + VOID +) +{ + CHAR ruleIPv4Prefix[BUFLEN_40] = "\0"; + CHAR ruleIPv6Prefix[BUFLEN_40] = "\0"; + CHAR pdIPv6Prefix[BUFLEN_40] = "\0"; + CHAR brIPv6Prefix[BUFLEN_40] = "\0"; + errno_t rc = -1; + + rc = sprintf_s (ruleIPv4Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv4Prefix + , g_stMaptData.RuleIPv4PrefixLen); + ERR_CHK(rc); + rc = sprintf_s (ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix + , g_stMaptData.RuleIPv6PrefixLen); + ERR_CHK(rc); + rc = sprintf_s (pdIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.PdIPv6Prefix + , g_stMaptData.PdIPv6PrefixLen); + ERR_CHK(rc); + rc = sprintf_s (brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix + , g_stMaptData.BrIPv6PrefixLen); + ERR_CHK(rc); + + MAPT_LOG_INFO("\r" + "+-------------------------------------------------------------+%15s\n" + "| MAP-T Configuration |\n" + "+-------------------+-----------------------------------------+",""); + MAPT_LOG_INFO("\r" + "| fmr | %-40s" "|%15s\n" + "| ealen | %-40u" "|\n" + "| psid | %-40u" "|" + , g_stMaptData.bFMR?"true":"false", "" + , g_stMaptData.EaLen + , g_stMaptData.Psid); + MAPT_LOG_INFO("\r" + "| psidlen | %-40u" "|%15s\n" + "| psid offset | %-40u" "|\n" + "| ratio | %-40u" "|" + , g_stMaptData.PsidLen, "" + , g_stMaptData.PsidOffset + , g_stMaptData.Ratio); + MAPT_LOG_INFO("\r" + "| rule ipv4 prefix | %-40s" "|%15s\n" + "| rule ipv6 prefix | %-40s" "|\n" + "| ipv6 prefix | %-40s" "|" + , ruleIPv4Prefix, "" + , ruleIPv6Prefix + , pdIPv6Prefix); + MAPT_LOG_INFO("\r" + "| br ipv6 prefix | %-40s" "|%15s\n" + "| ipv4 suffix | %-40u" "|\n" + "| map ipv4 address | %-40s" "|" + , brIPv6Prefix, "" + , g_stMaptData.IPv4Suffix + , g_stMaptData.IPv4AddrString); + MAPT_LOG_INFO("\r" + "| map ipv6 address | %-40s" "|%15s\n" + "+-------------------+-----------------------------------------+\n" + , g_stMaptData.IPv6AddrString, ""); + + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptResetClient +( + VOID +) +{ + MAPT_LOG_INFO("Entry"); + + FILE* fd = NULL; + CHAR outBuf[BUFLEN_256] = {0}; + + if ( (fd = v_secure_popen("r", "ps | grep udhcp | grep erouter0")) ) + { + if ( fgets(outBuf, BUFLEN_256, fd) && !strstr(outBuf, "erouter0") ) + { + if ( v_secure_system("service_wan dhcp-start") ) + { + MAPT_LOG_ERROR("Failed to restore dhclient !"); + v_secure_pclose(fd); + return STATUS_FAILURE; + } + } + v_secure_pclose(fd); + } + return STATUS_SUCCESS; +} + + +static RETURN_STATUS +CosaDmlMaptResetEvents +( + VOID +) +{ + MAPT_LOG_INFO("Entry"); + MAPT_LOG_NOTICE("MAP_MODE: NONE"); + return commonSyseventSet (EVENT_MAPT_TRANSPORT_MODE, "NONE") + + | commonSyseventSet (EVENT_MAPT_CONFIG_FLAG, "") + + | commonSyseventSet (EVENT_MAPT_EA_LENGTH, "") + + | commonSyseventSet (EVENT_MAPT_RATIO, "") + + | commonSyseventSet (EVENT_MAPT_PSID_VALUE, "") + + | commonSyseventSet (EVENT_MAPT_PSID_LENGTH, "") + + | commonSyseventSet (EVENT_MAPT_PSID_OFFSET, "") + + | commonSyseventSet (EVENT_MAPT_IPADDRESS, "") + + | commonSyseventSet (EVENT_MAPT_IPV6_ADDRESS, "") + + | commonSyseventSet (EVENT_MAPT_BR_IPV6_PREFIX, "") + + | commonSyseventSet (EVENT_MAPT_RULE_IPADDRESS, "") + + | commonSyseventSet (EVENT_MAPT_RULE_IPV6_ADDRESS, "") + + | commonSyseventSet(EVENT_MAPT_IS_FMR, ""); +} + + +static RETURN_STATUS +CosaDmlMaptResetConfig +( + VOID +) +{ + RETURN_STATUS ret = STATUS_SUCCESS; + FILE* fd = NULL; + CHAR outBuf[BUFLEN_64] = {0}; + errno_t rc = -1; + + MAPT_LOG_INFO("Entry"); + + if ( (fd = v_secure_popen("r","ip -4 route show | grep default | grep %s", MAPT_INTERFACE)) ) + { + if ( fgets(outBuf, BUFLEN_64, fd) && strstr(outBuf, MAPT_INTERFACE) ) + { + v_secure_system("ip route del default"); + } + v_secure_pclose(fd); + } + + if ( (fd = v_secure_popen("r","ip -4 route show | grep default | grep erouter0")) ) + { + rc = memset_s (&outBuf, BUFLEN_64, 0, sizeof(outBuf)); + ERR_CHK(rc); + + if ( !fgets(outBuf, BUFLEN_64, fd) || !strstr(outBuf, "erouter0") ) + { + if ( v_secure_system("ip ro rep default dev erouter0") ) + { + MAPT_LOG_ERROR("Failed to restore ip routes !"); + ret = STATUS_FAILURE; + } + } + v_secure_pclose(fd); + } + + if ( (fd = v_secure_popen("r", "lsmod | grep nat46")) ) + { + rc = memset_s (&outBuf, BUFLEN_64, 0, sizeof(outBuf)); + ERR_CHK(rc); + + if ( fgets(outBuf, BUFLEN_64, fd) && strstr(outBuf, "nat46") ) + { + if ( v_secure_system("rmmod nat46.ko") ) + { + MAPT_LOG_ERROR("Failed to remove nat46 module !"); + ret = STATUS_FAILURE; + } + } + v_secure_pclose(fd); + } + +#if defined (_COSA_BCM_ARM_) && defined (_XB6_PRODUCT_REQ_) + if ( !access("/proc/sys/net/flowmgr/disable_mapt_accel", F_OK) ) + { + if ( v_secure_system("echo 3 > /proc/sys/net/flowmgr/disable_mapt_accel") ) + { + MAPT_LOG_ERROR("Failed to disable mapt packet acceleration!"); + } + } + else + { + MAPT_LOG_WARNING("Mapt packet acceleration is not supported!"); + } +#endif + + return ret; +} + + +static RETURN_STATUS +CosaDmlMaptRollback +( + RB_STATE eState +) +{ + RETURN_STATUS ret = STATUS_SUCCESS; + MAPT_LOG_INFO("Entry"); + + if ( eState & RB_EVENTS ) + { + ret |= CosaDmlMaptResetEvents(); + MAPT_LOG_INFO("### Mapt events reset.") + } + if ( eState & RB_FIREWALL ) + { + ret |= commonSyseventSet (EVENT_FIREWALL_RESTART, NULL); + MAPT_LOG_INFO("### Mapt firewall reset.") + } + if ( eState & RB_CONFIG ) + { + ret |= CosaDmlMaptResetConfig(); + MAPT_LOG_INFO("### Mapt config reset.") + } + if ( eState & RB_DHCPCLIENT ) + { + ret |= CosaDmlMaptResetClient(); + MAPT_LOG_INFO("### Mapt dhclient reset.") + } + if ( eState & RB_UPNPIGD ) + { + CHAR isEnabled[BUFLEN_4] = {0}; + + syscfg_get(NULL, SYSCFG_UPNP_IGD_ENABLED, isEnabled, sizeof(isEnabled)); + + if ( isEnabled[0] == '1' ) + { + g_bEnableUPnPIGD = 0; + } + + if ( g_bEnableUPnPIGD ) + { + pthread_t th_id; + if ( pthread_create(&th_id, NULL, &CosaDmlMaptSetUPnPIGDService, (PVOID)"true") ) + { + MAPT_LOG_ERROR("pthread create Failed, to reset UPnP_IGD Service!"); + } + } + } + + if ( eState ) + { + errno_t rt = -1; + rt = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rt); + + if ( !g_bRollBackInProgress ) + { + MAPT_LOG_INFO("##### Mapt rollback complete #####"); + } + } + + return ret; +} + + +static RETURN_STATUS +CosaDmlMaptConvertStringToHexStream +( + PUCHAR pWriteBf, + PUINT16 uiOptionBufLen +) +{ + PUCHAR pReadBf = pWriteBf; + MAPT_LOG_INFO("Entry"); + + if ( !pWriteBf ) + { + MAPT_LOG_ERROR("MAPT string buffer is empty !!"); + return STATUS_FAILURE; + } + + if ( *pReadBf == '\'' && pReadBf++ ) {} + + if ( pReadBf[strlen((PCHAR)pReadBf)-1] == '\'' ) + { + pReadBf[strlen((PCHAR)pReadBf)-1] = '\0'; + } + +MAPT_LOG_INFO("<<>> pOptionBuf is %p : %s",pReadBf, pReadBf); + while ( *pReadBf && *(pReadBf+1) ) + { + if ( *pReadBf == ':' && pReadBf++ ) {} + + *pWriteBf = (STRING_TO_HEX(*pReadBf) << 4) | STRING_TO_HEX(*(pReadBf+1)); + + ++pWriteBf; + ++pReadBf; + ++pReadBf; + ++*uiOptionBufLen; + } + *pWriteBf = '\0'; +MAPT_LOG_INFO("<<>> BufLen : %d", *uiOptionBufLen); + + return STATUS_SUCCESS; +} + +static RETURN_STATUS +CosaDmlMaptDisplayFeatureStatus +( + VOID +) +{ + RETURN_STATUS ret = STATUS_SUCCESS; + CHAR isEnabled[BUFLEN_4] = {0}; + + if ( !(ret|=syscfg_get(NULL, SYSCFG_UPNP_IGD_ENABLED, isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_UPnP_IGD_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_UPnP_IGD_disabled"); + } + } + *(PUINT32)isEnabled = 0; + + if ( !(ret|=syscfg_get(NULL, SYSCFG_DMZ_ENABLED, isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_UPnP_DMZ_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_DMZ_disabled"); + } + } + *(PUINT32)isEnabled = 0; + + if ( !(ret|=syscfg_get(NULL, SYSCFG_PORT_FORWARDING_ENABLED, isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_UPnP_Port_Forwarding_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_Port_Forwarding_disabled"); + } + } + *(PUINT32)isEnabled = 0; + + if ( !(ret|=syscfg_get(NULL, SYSCFG_PORT_TRIGGERING_ENABLED, isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_UPnP_Port_Triggering_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_Port_Triggering_disabled"); + } + } + *(PUINT32)isEnabled = 0; + + { + RETURN_STATUS ret2 = STATUS_SUCCESS; + + if ( !(ret2=syscfg_get(NULL, SYSCFG_MGMT_HTTP_ENABLED, isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_disabled"); + } + } +//#if defined(CONFIG_CCSP_WAN_MGMT_ACCESS) + else + if ( ret2 && + !(ret2=syscfg_get(NULL, SYSCFG_MGMT_HTTP_ENABLED"_ert", isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_disabled"); + } + } +//#endif + ret |= ret2; + } + *(PUINT32)isEnabled = 0; + + if ( !(ret|=syscfg_get(NULL, SYSCFG_MGMT_HTTPS_ENABLED, isEnabled, sizeof(isEnabled))) ) + { + if ( '1' == isEnabled[0] ) + { + MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_https_enabled"); + } + else + { + MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_https_disabled"); + } + } + + return ret? STATUS_FAILURE : STATUS_SUCCESS; +} + + +/* + * External api definitions + */ +ANSC_STATUS +CosaDmlMaptProcessOpt95Response +( + PCHAR pPdIPv6Prefix, + PUCHAR pOptionBuf +) +{ + RETURN_STATUS ret = STATUS_SUCCESS; + UINT16 uiOptionBufLen = 0; + errno_t rc = -1; + + UINT prevCheckSum = s_Option95CheckSum; + + s_Option95CheckSum = CosaDmlMaptCalculateChecksum(pOptionBuf); + MAPT_LOG_INFO("Prev option95 checksum: %d, new option95 checksum: %d", prevCheckSum, s_Option95CheckSum); + if (s_Option95CheckSum == prevCheckSum) + { + MAPT_LOG_INFO("No change in received option95 data. No need to configure MAPT again!"); + return ret; + } + MAPT_LOG_INFO("Entry"); + + /* Check MAPT configuration, if already active, do rollback RB_ALL */ + if ( g_stMaptData.RuleIPv4Prefix[0] ) + { + MAPT_LOG_INFO("MAPT is configured already, hence calling mapt-Rollback !"); + g_bRollBackInProgress = 1; + if ( CosaDmlMaptRollback (RB_EVENTS|RB_FIREWALL|RB_CONFIG) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT rollback failed !!"); + } + } + + /* Convert the received string buffer into hex stream */ + rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rc); + if ( CosaDmlMaptConvertStringToHexStream (pOptionBuf, &uiOptionBufLen) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT string buffer to HexStream conversion Failed !!"); + ret = STATUS_FAILURE; + } + + /* Store IPv6 prefix and length */ + rc = memcpy_s (&g_stMaptData.PdIPv6Prefix, BUFLEN_40, pPdIPv6Prefix, + (strchr(pPdIPv6Prefix, '/') - pPdIPv6Prefix)); + ERR_CHK(rc); + g_stMaptData.PdIPv6PrefixLen = strtol((strchr(pPdIPv6Prefix, '/') + 1), NULL, 10); +MAPT_LOG_INFO("<<>> Received PdIPv6Prefix : %s/%u", g_stMaptData.PdIPv6Prefix + , g_stMaptData.PdIPv6PrefixLen); + if ( !ret && !g_stMaptData.PdIPv6Prefix[0] ) + { + MAPT_LOG_ERROR("PdIPv6Prefix is NULL !!"); + ret = STATUS_FAILURE; + } + + /* Parse the hex buffer for mapt options */ + if ( !ret && CosaDmlMaptParseResponse (pOptionBuf, uiOptionBufLen) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT Parsing Response Failed !!"); + rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rc); + ret = STATUS_FAILURE; + } + + /* Derive IPv4 suffix and PSID value */ + if ( !ret && CosaDmlMaptComputePsidAndIPv4Suffix ( g_stMaptData.PdIPv6Prefix + , g_stMaptData.PdIPv6PrefixLen + , g_stMaptData.RuleIPv6PrefixLen + , g_stMaptData.RuleIPv4PrefixLen + , &g_stMaptData.Psid + , &g_stMaptData.PsidLen + , &g_stMaptData.IPv4Suffix) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT Psid and IPv4 Suffix Computaion Failed !!"); + rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rc); + ret = STATUS_FAILURE; + } + + /* Calculate CE IPv4 Address */ + if ( !ret && CosaDmlMaptFormulateIPv4Address ( g_stMaptData.IPv4Suffix + , g_stMaptData.IPv4AddrString) != STATUS_SUCCESS) + { + MAPT_LOG_ERROR("MAPT Ipv4 Configuration Failed !!"); + rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rc); + ret = STATUS_FAILURE; + } + + /* Calculate CE IPv6 Address */ + if ( !ret && CosaDmlMaptFormulateIPv6Address ( g_stMaptData.PdIPv6Prefix + , g_stMaptData.IPv4AddrString + , g_stMaptData.Psid + , g_stMaptData.IPv6AddrString) != STATUS_SUCCESS) + { + MAPT_LOG_ERROR("MAPT Ipv6 Configuration Failed !!"); + rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rc); + ret = STATUS_FAILURE; + } + + if ( ret ) + { + if ( g_bRollBackInProgress ) + { + g_bRollBackInProgress = 0; + CosaDmlMaptRollback (RB_DHCPCLIENT|RB_UPNPIGD); + } + return ANSC_STATUS_FAILURE; + } + + /* Stop UPnP_IGD and DHCPv4 Client services */ + CosaDmlMaptStopServices(); + + /* set mapt sysevents and restart Firewall */ + if ( CosaDmlMaptSetEvents() ) + { + MAPT_LOG_ERROR("MAPT set events Failed !!"); + CosaDmlMaptRollback (RB_EVENTS|RB_DHCPCLIENT|RB_UPNPIGD); + return ANSC_STATUS_FAILURE; + } + + /* Load nat46 module and configure */ + if ( CosaDmlMaptApplyConfig() ) + { + MAPT_LOG_ERROR("MAPT Apply Configurations Failed !!"); + CosaDmlMaptRollback (RB_CONFIG|RB_EVENTS|RB_DHCPCLIENT|RB_UPNPIGD); + return ANSC_STATUS_FAILURE; + } + + /* Restarting firewall to apply mapt rules */ + MAPT_LOG_INFO("MAPT events are set. Triggering firewall-restart"); + commonSyseventSet (EVENT_FIREWALL_RESTART, NULL); + + MAPT_LOG_INFO("Triggering ntpd-restart"); + commonSyseventSet (EVENT_NTPD_RESTART, NULL); + + /* Display port based features' status */ + if ( CosaDmlMaptDisplayFeatureStatus() ) + { + MAPT_LOG_ERROR("MAPT get(syscfg) feature status Failed!"); + } + + CosaDmlMaptPrintConfig(); + + MAPT_LOG_INFO("MAPT configuration complete.\n"); + + return ANSC_STATUS_SUCCESS; +} + +#if defined(MAPT_UNIFICATION_ENABLED) +ANSC_STATUS +CosaDmlMaptParseOpt95Response +( + PCHAR pPdIPv6Prefix, + PUCHAR pOptionBuf, + ipc_dhcpv6_data_t *dhcpv6_data +) +{ + RETURN_STATUS ret = STATUS_SUCCESS; + UINT16 uiOptionBufLen = 0; + errno_t rc = -1; + + MAPT_LOG_INFO("Entry"); + + /* Convert the received string buffer into hex stream */ + rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + ERR_CHK(rc); + if ( CosaDmlMaptConvertStringToHexStream (pOptionBuf, &uiOptionBufLen) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT string buffer to HexStream conversion Failed !!"); + ret = STATUS_FAILURE; + } + + /* Store IPv6 prefix and length */ + rc = memcpy_s (&g_stMaptData.PdIPv6Prefix, BUFLEN_40, pPdIPv6Prefix, + (strchr(pPdIPv6Prefix, '/') - pPdIPv6Prefix)); + ERR_CHK(rc); + g_stMaptData.PdIPv6PrefixLen = strtol((strchr(pPdIPv6Prefix, '/') + 1), NULL, 10); + MAPT_LOG_INFO("<<>> Received PdIPv6Prefix : %s/%u", g_stMaptData.PdIPv6Prefix + , g_stMaptData.PdIPv6PrefixLen); + if ( !ret && !g_stMaptData.PdIPv6Prefix[0] ) + { + MAPT_LOG_ERROR("PdIPv6Prefix is NULL !!"); + ret = STATUS_FAILURE; + } + + /* Parse the hex buffer for mapt options */ + if ( !ret && CosaDmlMaptParseResponse (pOptionBuf, uiOptionBufLen) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT Parsing Response Failed !!"); + ret = STATUS_FAILURE; + } + + /* Derive IPv4 suffix and PSID value */ + if ( !ret && CosaDmlMaptComputePsidAndIPv4Suffix ( g_stMaptData.PdIPv6Prefix + , g_stMaptData.PdIPv6PrefixLen + , g_stMaptData.RuleIPv6PrefixLen + , g_stMaptData.RuleIPv4PrefixLen + , &g_stMaptData.IPv4Psid + , &g_stMaptData.IPv4PsidLen + , &g_stMaptData.IPv4Suffix) != STATUS_SUCCESS ) + { + MAPT_LOG_ERROR("MAPT Psid and IPv4 Suffix Computaion Failed !!"); + ret = STATUS_FAILURE; + } + + /* Calculate CE IPv4 Address */ + if ( !ret && CosaDmlMaptFormulateIPv4Address ( g_stMaptData.IPv4Suffix + , g_stMaptData.IPv4AddrString) != STATUS_SUCCESS) + { + MAPT_LOG_ERROR("MAPT Ipv4 Configuration Failed !!"); + ret = STATUS_FAILURE; + } + + /* Calculate CE IPv6 Address */ + if ( !ret && CosaDmlMaptFormulateIPv6Address ( g_stMaptData.PdIPv6Prefix + , g_stMaptData.IPv4AddrString + , g_stMaptData.Psid + , g_stMaptData.IPv6AddrString) != STATUS_SUCCESS) + { + MAPT_LOG_ERROR("MAPT Ipv6 Configuration Failed !!"); + ret = STATUS_FAILURE; + } + + if( ret == STATUS_SUCCESS ) + { + //Fill Required MAP-T information + dhcpv6_data->maptAssigned = TRUE; + dhcpv6_data->mapt.v6Len = g_stMaptData.RuleIPv6PrefixLen; + dhcpv6_data->mapt.isFMR = g_stMaptData.bFMR ? TRUE : FALSE; + dhcpv6_data->mapt.eaLen = g_stMaptData.EaLen; + dhcpv6_data->mapt.v4Len = g_stMaptData.RuleIPv4PrefixLen; + dhcpv6_data->mapt.psidOffset = g_stMaptData.PsidOffset; + dhcpv6_data->mapt.psidLen = g_stMaptData.PsidLen; + dhcpv6_data->mapt.psid = g_stMaptData.Psid; + dhcpv6_data->mapt.iapdPrefixLen = g_stMaptData.PdIPv6PrefixLen; + dhcpv6_data->mapt.ratio = g_stMaptData.Ratio; + + rc = sprintf_s (dhcpv6_data->mapt.pdIPv6Prefix, BUFLEN_40, "%s", g_stMaptData.PdIPv6Prefix); + ERR_CHK(rc); + rc = sprintf_s (dhcpv6_data->mapt.ruleIPv4Prefix, BUFLEN_40, "%s", g_stMaptData.RuleIPv4Prefix); + ERR_CHK(rc); + rc = sprintf_s (dhcpv6_data->mapt.ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix + , g_stMaptData.RuleIPv6PrefixLen); + ERR_CHK(rc); + rc = sprintf_s (dhcpv6_data->mapt.brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix + , g_stMaptData.BrIPv6PrefixLen); + ERR_CHK(rc); + + CosaDmlMaptPrintConfig(); + + MAPT_LOG_INFO("MAPT configuration complete.\n"); + } + + return ((ret) ? ANSC_STATUS_FAILURE : ANSC_STATUS_SUCCESS); +} +#endif /** MAPT_UNIFICATION_ENABLED */ diff --git a/source/WanManager/MaptParsing/cosa_mapt_apis.h b/source/WanManager/MaptParsing/cosa_mapt_apis.h new file mode 100644 index 00000000..d351d878 --- /dev/null +++ b/source/WanManager/MaptParsing/cosa_mapt_apis.h @@ -0,0 +1,306 @@ +/* + * If not stated otherwise in this file or this component's Licenses.txt file the + * following copyright and licenses apply: + * + * Copyright 2020 RDK Management + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. +*/ + +/********************************************************************** + Copyright [2014] [Cisco Systems, Inc.] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +**********************************************************************/ + +/************************************************************************** + + module: cosa_mapt_apis.h + + For COSA Data Model Library Development. + + ------------------------------------------------------------------- + + description: + + This file implementes back-end apis for the COSA Data Model Library + + ------------------------------------------------------------------- + + author: + + COSA XML TOOL CODE GENERATOR 1.0 + + ------------------------------------------------------------------- + + revision: + + 12/07/2021 initial revision. + + +**************************************************************************/ +#if defined(FEATURE_SUPPORT_MAPT_NAT46) || defined(MAPT_UNIFICATION_ENABLED) +#ifndef _COSA_MAPT_APIS_H +#define _COSA_MAPT_APIS_H + +#include "cosa_apis.h" + +#if defined(FEATURE_RDKB_WAN_MANAGER) +#include "ipc_msg.h" +#endif + +#define COSA_MAPT_SYSCFG_NAMESPACE "CosaMAPT" +#define COSA_MAPT_ID_SYSCFG_NAMESPACE COSA_MAPT_SYSCFG_NAMESPACE"IDs" + +/* + * DHCP MAPT options macro definitions + */ +#define MAPT_OPTION_S46_RULE 89 +#define MAPT_OPTION_S46_BR 90 +#define MAPT_OPTION_S46_DMR 91 +#define MAPT_OPTION_S46_PORT_PARAMS 93 +#define MAPT_OPTION_S46_CONT_MAPT 95 + +/* + * MAPT events macro definitions + */ +#define EVENT_MAPT_TRANSPORT_MODE "map_transport_mode" +#define EVENT_MAPT_CONFIG_FLAG "mapt_config_flag" +#define EVENT_MAPT_EA_LENGTH "map_ea_length" +#define EVENT_MAPT_IS_FMR "map_is_fmr" +#define EVENT_MAPT_RATIO "mapt_ratio" +#define EVENT_MAPT_PSID_OFFSET "mapt_psid_offset" +#define EVENT_MAPT_PSID_VALUE "mapt_psid_value" +#define EVENT_MAPT_PSID_LENGTH "mapt_psid_length" +#define EVENT_MAPT_IPADDRESS "mapt_ip_address" +#define EVENT_MAPT_IPV6_ADDRESS "mapt_ipv6_address" +#define EVENT_MAPT_RULE_IPADDRESS "map_rule_ip_address" +#define EVENT_MAPT_RULE_IPV6_ADDRESS "map_rule_ipv6_address" +#define EVENT_MAPT_BR_IPV6_PREFIX "map_br_ipv6_prefix" +#define EVENT_FIREWALL_RESTART "firewall-restart" +#define EVENT_NTPD_RESTART "ntpd-restart" + +#define MAPT_INTERFACE "map0" +#define MAPT_MTU_SIZE "1500" +#define MAPT_V4_MTU_SIZE "1472" + +#define BUFLEN_4 4 +#define BUFLEN_8 8 +#define BUFLEN_16 16 +#define BUFLEN_24 24 +#define BUFLEN_32 32 +#define BUFLEN_40 40 +#define BUFLEN_64 64 +#define BUFLEN_128 128 +#define BUFLEN_256 256 +#define BUFLEN_512 512 +#define BUFLEN_1024 1024 + +#define SYSCFG_UPNP_IGD_ENABLED "upnp_igd_enabled" +#define SYSCFG_DMZ_ENABLED "dmz_enabled" +#define SYSCFG_PORT_FORWARDING_ENABLED "CosaNAT::port_forward_enabled" +#define SYSCFG_PORT_TRIGGERING_ENABLED "CosaNAT::port_trigger_enabled" +#define SYSCFG_MGMT_HTTPS_ENABLED "mgmt_wan_httpsaccess" +#define SYSCFG_MGMT_HTTP_ENABLED "mgmt_wan_httpaccess" + +/* + * Data type Macro definitions + */ +#ifndef VOID + #define VOID void +#endif + +#ifndef UINT8 + #define UINT8 unsigned char +#endif + +#ifndef UINT16 + #define UINT16 unsigned short +#endif + +#ifndef UINT32 + #define UINT32 unsigned int +#endif + +#ifndef UCHAR + #define UCHAR unsigned char +#endif + +#ifndef ULONG + #define ULONG unsigned long +#endif + +#ifndef ULONGLONG + #define ULONGLONG unsigned long long +#endif + +#ifndef CHAR + #define CHAR char +#endif + +#ifndef INT8 + #define INT8 char +#endif + +#ifndef INT16 + #define INT16 short +#endif + +#ifndef INT32 + #define INT32 int +#endif + +#ifndef LONG + #define LONG long +#endif + +#ifndef PVOID + #define PVOID void* +#endif + +#ifndef PCHAR + #define PCHAR char* +#endif + +#ifndef PUCHAR + #define PUCHAR unsigned char* +#endif + +#ifndef PUINT8 + #define PUINT8 unsigned char* +#endif + +#ifndef PUINT16 + #define PUINT16 unsigned short* +#endif + +#ifndef PUINT32 + #define PUINT32 unsigned int* +#endif + +#ifndef PULONG + #define PULONG unsigned long* +#endif + +#ifndef BOOLEAN + #define BOOLEAN unsigned char +#endif + +#define MAPT_LOG_INFO(format, ...) \ + CcspTraceInfo (("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) +#define MAPT_LOG_ERROR(format, ...) \ + CcspTraceError (("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) +#define MAPT_LOG_NOTICE(format, ...) \ + CcspTraceNotice (("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) +#define MAPT_LOG_WARNING(format, ...) \ + CcspTraceWarning(("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) + +/* + * Enums and structure definition + */ +typedef enum +_RETURN_STATUS +{ + STATUS_SUCCESS = 0, + STATUS_FAILURE = -1 +} RETURN_STATUS; + + +typedef enum +_RB_STATE +{ + RB_NONE = 0x00, + RB_ALL = 0x1F, + RB_UPNPIGD = 0x10, + RB_EVENTS = 0x08, + RB_FIREWALL = 0x04, + RB_CONFIG = 0x02, + RB_DHCPCLIENT = 0x01 +} RB_STATE; + + +typedef struct +_COSA_DML_MAPT_DATA +{ + CHAR RuleIPv4Prefix[BUFLEN_16]; + CHAR RuleIPv6Prefix[BUFLEN_40]; + CHAR IPv4AddrString[BUFLEN_16]; + CHAR IPv6AddrString[BUFLEN_40]; + CHAR PdIPv6Prefix[BUFLEN_40]; + CHAR BrIPv6Prefix[BUFLEN_40]; + UCHAR RuleIPv6PrefixH[BUFLEN_24]; + UINT16 RuleIPv4PrefixLen; + UINT16 RuleIPv6PrefixLen; + UINT16 BrIPv6PrefixLen; + UINT16 PdIPv6PrefixLen; + UINT16 EaLen; + UINT16 Psid; + UINT16 PsidLen; + UINT32 PsidOffset; + UINT32 IPv4Suffix; + UINT16 IPv4Psid; + UINT16 IPv4PsidLen; + UINT32 Ratio; + BOOLEAN bFMR; +} COSA_DML_MAPT_DATA, *PCOSA_DML_MAPT_DATA; + + +typedef struct +_COSA_DML_MAPT_OPTION +{ + UINT16 OptType; + UINT16 OptLen; +} __attribute__ ((__packed__)) COSA_DML_MAPT_OPTION, *PCOSA_DML_MAPT_OPTION; + +/************************************* + The actual function declaration +**************************************/ +/* + * Description: + * This routine parses the option-95 response and sets the configs required. + * Arguments: + * pPdIPv6Prefix Obtained IPv6 prefix through prefix delegation. + * uiPdIPv6PrefixLen IPv6 prefix length. + * pOptionBuf Buffer containing option-95 response. + * uiOptionBufLen Response buffer length. + * Return: + * Status of operation. + */ +ANSC_STATUS +CosaDmlMaptProcessOpt95Response + ( + PCHAR pPdIPv6Prefix, + PUCHAR pOptionBuf + ); + +#if defined(MAPT_UNIFICATION_ENABLED) +ANSC_STATUS +CosaDmlMaptParseOpt95Response + ( + PCHAR pPdIPv6Prefix, + PUCHAR pOptionBuf, + ipc_dhcpv6_data_t *dhcpv6_data + ); +#endif /** MAPT_UNIFICATION_ENABLED */ +#endif +#endif From c7c48926b87ad02c597456b0e1dc0c4d486139eb Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Tue, 22 Oct 2024 15:53:40 +0000 Subject: [PATCH 30/64] RDKB-57269 : MAPT APIs file cleanup. Signed-off-by: Parthiban Selvaraj --- .../WanManager/MaptParsing/cosa_mapt_apis.c | 879 +----------------- .../WanManager/MaptParsing/cosa_mapt_apis.h | 41 +- source/WanManager/wanmgr_dhcpv6_apis.c | 8 + 3 files changed, 68 insertions(+), 860 deletions(-) diff --git a/source/WanManager/MaptParsing/cosa_mapt_apis.c b/source/WanManager/MaptParsing/cosa_mapt_apis.c index ad7abab9..3ec8a2a2 100644 --- a/source/WanManager/MaptParsing/cosa_mapt_apis.c +++ b/source/WanManager/MaptParsing/cosa_mapt_apis.c @@ -83,12 +83,8 @@ #include #include "ccsp_psm_helper.h" #include "sys_definitions.h" -//#include "ccsp_custom.h" #include "cosa_mapt_apis.h" -#include "plugin_main_apis.h" #include "secure_wrapper.h" -#include "safec_lib_common.h" -#include "cosa_drg_common.h" /* * Macro definitions */ @@ -98,8 +94,6 @@ #define THIRD_BYTE(byte) (byte & 0xFF0000) #define FORTH_BYTE(byte) (byte & 0xFF000000) -#define RESOLV_CONF_FILE "/etc/resolv.conf" -#define RESOLV_CONF_FILE_BK "/tmp/resolv_conf.bk" #define SET_BIT_MASK(maskBits, shiftBits) ( \ (ULONGLONG)(0xFFFFFFFFFFFFFFFF << (64-maskBits)) \ @@ -110,19 +104,19 @@ #define STRING_TO_HEX(pStr) ( (pStr-'a'<0)? (pStr-'A'<0)? pStr-'0' : pStr-'A'+10 : pStr-'a'+10 ) +#define ERR_CHK(x) /* * Static function prototypes */ -static RETURN_STATUS CosaDmlMaptApplyConfig (VOID); -static RETURN_STATUS CosaDmlMaptSetEvents (VOID); +//PARTHIBAN : disable_mapt_accel static RETURN_STATUS CosaDmlMaptPrintConfig (VOID); -static RETURN_STATUS CosaDmlMaptResetConfig (VOID); -static RETURN_STATUS CosaDmlMaptResetClient (VOID); -static RETURN_STATUS CosaDmlMaptResetEvents (VOID); -static RETURN_STATUS CosaDmlMaptStopServices (VOID); -static RETURN_STATUS CosaDmlMaptDisplayFeatureStatus (VOID); -static RETURN_STATUS CosaDmlMaptFlushDNSv4Entries (VOID); -static RETURN_STATUS CosaDmlMaptRollback (RB_STATE eState); +//static RETURN_STATUS CosaDmlMaptResetConfig (VOID); +//static RETURN_STATUS CosaDmlMaptResetClient (VOID); +//static RETURN_STATUS CosaDmlMaptResetEvents (VOID); +//static RETURN_STATUS CosaDmlMaptStopServices (VOID); +//static RETURN_STATUS CosaDmlMaptDisplayFeatureStatus (VOID); //PARTHIBAN : check other features +//static RETURN_STATUS CosaDmlMaptFlushDNSv4Entries (VOID); +//static RETURN_STATUS CosaDmlMaptRollback (RB_STATE eState); //PARTHIBAN : Check IGD static RETURN_STATUS CosaDmlMaptParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); static RETURN_STATUS CosaDmlMaptFormulateIPv4Address (UINT32 ipv4Suffix, PCHAR pIPv4AddrString); @@ -134,6 +128,7 @@ static RETURN_STATUS CosaDmlMaptComputePsidAndIPv4Suffix (PCHAR pPdIPv6Prefix, UINT16 ui16PdPrefixLen, UINT16 ui16v6PrefixLen, UINT16 ui16v4PrefixLen, PUINT16 pPsid, PUINT16 pPsidLen, PUINT32 pIPv4Suffix); +//PARTHIBAN : Check IGD and Ipv4 DNS static PVOID CosaDmlMaptSetUPnPIGDService (PVOID arg); /* @@ -170,7 +165,7 @@ CosaDmlMaptFormulateIPv4Address UCHAR ipv4AddrBytes[BUFLEN_4]; struct in_addr ipv4Addr; UINT32 ipv4Hex = 0; - errno_t rc = -1; + int rc = -1; MAPT_LOG_INFO("Entry"); @@ -187,7 +182,7 @@ CosaDmlMaptFormulateIPv4Address | THIRD_BYTE((THIRD_BYTE(ipv4Hex) + THIRD_BYTE(ipv4Suffix))) | FORTH_BYTE((FORTH_BYTE(ipv4Hex) + FORTH_BYTE(ipv4Suffix))); - rc = sprintf_s (pIPv4AddrString, BUFLEN_16, "%d.%d.%d.%d", + rc = snprintf (pIPv4AddrString, BUFLEN_16, "%d.%d.%d.%d", ipv4AddrBytes[3], ipv4AddrBytes[2], ipv4AddrBytes[1], ipv4AddrBytes[0]); ERR_CHK(rc); @@ -208,7 +203,7 @@ CosaDmlMaptFormulateIPv6Address struct in6_addr ipv6Addr; struct in_addr ipv4Addr; UINT32 ipv4Hex = 0; - errno_t rc = -1; + int rc = -1; MAPT_LOG_INFO("Entry"); @@ -231,7 +226,7 @@ CosaDmlMaptFormulateIPv6Address return STATUS_FAILURE; } - rc = sprintf_s (pIPv6AddrString, BUFLEN_40, + rc = snprintf (pIPv6AddrString, BUFLEN_40, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", ipv6Addr.s6_addr[0], ipv6Addr.s6_addr[1], ipv6Addr.s6_addr[2], ipv6Addr.s6_addr[3], ipv6Addr.s6_addr[4], ipv6Addr.s6_addr[5], ipv6Addr.s6_addr[6], ipv6Addr.s6_addr[7], @@ -252,7 +247,7 @@ CosaDmlMaptGetIPv6StringFromHex PCHAR pIPv6AddrS ) { - errno_t rc = -1; + int rc = -1; MAPT_LOG_INFO("Entry"); if ( !(pIPv6AddrH && pIPv6AddrS) ) @@ -262,7 +257,7 @@ CosaDmlMaptGetIPv6StringFromHex return STATUS_FAILURE; } - rc = memset_s (pIPv6AddrS, BUFLEN_40, 0, BUFLEN_40); + rc = memset(pIPv6AddrS, 0, BUFLEN_40); ERR_CHK(rc); if ( !inet_ntop(AF_INET6, pIPv6AddrH, pIPv6AddrS, BUFLEN_40) ) @@ -274,100 +269,6 @@ CosaDmlMaptGetIPv6StringFromHex return STATUS_SUCCESS; } - -static RETURN_STATUS -CosaDmlMaptApplyConfig -( - VOID -) -{ - MAPT_LOG_INFO("Entry"); -#if defined (_COSA_BCM_ARM_) && defined (_XB6_PRODUCT_REQ_) - if ( access("/proc/sys/net/flowmgr/disable_mapt_accel", F_OK) ) - { - MAPT_LOG_ERROR("Mapt packet acceleration not supported!"); - } else if ( v_secure_system("echo 0 > /proc/sys/net/flowmgr/disable_mapt_accel") ) - { - MAPT_LOG_ERROR("Failed to enable mapt packet acceleration!"); - } -#endif - - if ( v_secure_system("insmod /lib/modules/`uname -r`/extra/nat46.ko zero_csum_pass=1") ) - { - MAPT_LOG_ERROR("Failed to load nat46 module!"); - return STATUS_FAILURE; - } - - if ( v_secure_system("echo add %s > /proc/net/nat46/control", MAPT_INTERFACE) ) - { - MAPT_LOG_ERROR("Failed to add %s iface in nat46 module!", MAPT_INTERFACE); - return STATUS_FAILURE; - } - - if ( v_secure_system("echo config %s local.v4 %s/%d local.v6 %s/%d " - "local.style MAP local.ea-len %d local.psid-offset %d " - "remote.v4 0.0.0.0/0 remote.v6 %s/%d remote.style RFC6052 " - "remote.ea-len 0 remote.psid-offset 0 debug 0 " - "local.pd %s/%d > /proc/net/nat46/control", - MAPT_INTERFACE, - g_stMaptData.RuleIPv4Prefix, g_stMaptData.RuleIPv4PrefixLen, - g_stMaptData.RuleIPv6Prefix, g_stMaptData.RuleIPv6PrefixLen, - g_stMaptData.EaLen, g_stMaptData.PsidOffset, - g_stMaptData.BrIPv6Prefix, g_stMaptData.BrIPv6PrefixLen, - g_stMaptData.PdIPv6Prefix, g_stMaptData.PdIPv6PrefixLen) ) - { - MAPT_LOG_ERROR("Failed to configure map0 iface!"); - return STATUS_FAILURE; - } - MAPT_LOG_INFO("Nat46 module loaded and configured successfully."); - - if ( v_secure_system("ip link set %s up", MAPT_INTERFACE) ) - { - MAPT_LOG_ERROR("Failed to set %s link up!", MAPT_INTERFACE); - return STATUS_FAILURE; - } - - if ( v_secure_system("ip route del default") ) - { - MAPT_LOG_WARNING("Failed to delete default route!"); - } - - if ( v_secure_system("ip ro rep default dev %s mtu %s", MAPT_INTERFACE , MAPT_V4_MTU_SIZE) ) - { - MAPT_LOG_ERROR("Failed to set %s as default route!", MAPT_INTERFACE); - return STATUS_FAILURE; - } - - if ( v_secure_system("ip link set dev %s mtu %s", MAPT_INTERFACE, MAPT_MTU_SIZE) ) - { - MAPT_LOG_ERROR("Failed to set mtu %s on %s!", MAPT_MTU_SIZE, MAPT_INTERFACE); - return STATUS_FAILURE; - } - - if ( v_secure_system("ip -6 route add %s dev %s metric 256 mtu %s", - g_stMaptData.IPv6AddrString, MAPT_INTERFACE, MAPT_MTU_SIZE) ) - { - MAPT_LOG_ERROR("Failed to add %s route on %s!", - g_stMaptData.IPv6AddrString, MAPT_INTERFACE); - return STATUS_FAILURE; - } - MAPT_LOG_INFO("Ip routes modified successfully."); - - // override udp timeout for mapt - if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout=30") ) - { - MAPT_LOG_ERROR("Failed to set nf_conntrack_udp_timeout!"); - } - - if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=30") ) - { - MAPT_LOG_ERROR("Failed to set nf_conntrack_udp_timeout_stream!"); - } - - return STATUS_SUCCESS; -} - - static PVOID CosaDmlMaptSetUPnPIGDService ( @@ -378,7 +279,7 @@ CosaDmlMaptSetUPnPIGDService INT ret = CCSP_FAILURE; extern CHAR g_Subsystem[BUFLEN_32]; CHAR dst_pathname_cr[BUFLEN_64] = {0}; - errno_t safec_ret = -1; + int safec_ret = -1; PCHAR faultParam = NULL; componentStruct_t** ppComponents = NULL; parameterValStruct_t value = {"Device.UPnP.Device.UPnPIGD", @@ -389,7 +290,7 @@ CosaDmlMaptSetUPnPIGDService pthread_detach(pthread_self()); - safec_ret = sprintf_s(dst_pathname_cr, sizeof(dst_pathname_cr), "%s%s", g_Subsystem, CCSP_DBUS_INTERFACE_CR); + safec_ret = snprintf(dst_pathname_cr, sizeof(dst_pathname_cr), "%s%s", g_Subsystem, CCSP_DBUS_INTERFACE_CR); ERR_CHK(safec_ret); ret = CcspBaseIf_discComponentSupportingNamespace(bus_handle @@ -445,232 +346,6 @@ CosaDmlMaptSetUPnPIGDService return STATUS_NULL; } - -static RETURN_STATUS -CosaDmlMaptFlushDNSv4Entries -( - VOID -) -{ - /* Flush v4 DNS enteries from resolv conf */ - if ( !access(RESOLV_CONF_FILE, F_OK) ) - { - struct in_addr ipv4Addr; - FILE* fp = NULL; - FILE* tp = NULL; - UINT8 overWrite = 0; - INT32 ret = -1; - INT32 resComp = -1; - CHAR nmSrv[BUFLEN_32] = {0}; - CHAR dnsIP[BUFLEN_64] = {0}; - CHAR leftOut[BUFLEN_128] = {0}; - - if ( !(fp = fopen(RESOLV_CONF_FILE, "r")) ) - { - MAPT_LOG_ERROR("Error opening %s ", RESOLV_CONF_FILE); - return STATUS_FAILURE; - } - - if ( !(tp = fopen(RESOLV_CONF_FILE_BK, "w")) ) - { - MAPT_LOG_ERROR("Error opening %s", RESOLV_CONF_FILE_BK); - /* CID 277328 fix */ - fclose(fp); - return STATUS_FAILURE; - } - - MAPT_LOG_INFO("#### Remove DNS Entries ####"); - while (memset(nmSrv, 0, sizeof(nmSrv)), - memset(dnsIP, 0, sizeof(dnsIP)), - memset(leftOut, 0, sizeof(leftOut)), - /* CID 277314 Calling risky function fix : Use correct precision specifiers */ - fscanf(fp, "%31s %63s%127[^\n]s\n", nmSrv, dnsIP, leftOut) != EOF) - { - ret = strcmp_s(nmSrv, sizeof(nmSrv), "nameserver", &resComp); - ERR_CHK(ret); - - if ( !ret && !resComp ) - { - if ( inet_pton(AF_INET, dnsIP, &ipv4Addr) > 0 ) - { - MAPT_LOG_INFO("DEL %s", dnsIP); - overWrite = 1; - continue; - } - } - fprintf(tp, "%s %s%s\n", nmSrv, dnsIP, leftOut); - } - MAPT_LOG_INFO("############################"); - - fclose(tp); - fclose(fp); - - if ( overWrite ) - { - char buf[BUFLEN_256] = {0}; - - if ( !(fp = fopen(RESOLV_CONF_FILE, "w")) || - !(tp = fopen(RESOLV_CONF_FILE_BK, "r"))) - { - MAPT_LOG_ERROR("Copy failed %s -> %s", RESOLV_CONF_FILE, RESOLV_CONF_FILE_BK); - /* CID 277328 fix - Resource Leak */ - if(fp != NULL) - fclose(fp); - return STATUS_FAILURE; - } - - while (fgets(buf, sizeof(buf), tp)) - { - fputs(buf, fp); - } - - fclose(tp); - fclose(fp); - } - - if ( remove(RESOLV_CONF_FILE_BK) ) - { - MAPT_LOG_WARNING("Couldn't remove file: %s", RESOLV_CONF_FILE_BK); - } - } - else - { - MAPT_LOG_ERROR("File not found: %s", RESOLV_CONF_FILE); - return STATUS_FAILURE; - } - - return STATUS_SUCCESS; -} - - -static RETURN_STATUS -CosaDmlMaptStopServices -( - VOID -) -{ - char eth_wan_enable_flag[BUFLEN_8] = {0}; - int strcmp_ret = -1; - errno_t rc = -1; - - /* Bring down DHCPv4 client */ - if ( v_secure_system("service_wan dhcp-release") ) - { - MAPT_LOG_ERROR("Wan Dhcp Release Failed !!"); - } - if ( v_secure_system("service_wan dhcp-stop") ) - { - MAPT_LOG_ERROR("Wan Dhcp Stop Failed !!"); - } - - commonSyseventSet ("current_wan_ipaddr", "0.0.0.0"); - /* Try validating the service stop. status may be? */ - MAPT_LOG_INFO("DHCPv4 client is made down."); - - /* FIXME: Issue in DNS ipv6 resolution when ethwan enabled */ - /* Workaround: We keep the ipv4 entries for name resolution */ - if (0 == syscfg_get(NULL, "eth_wan_enabled", eth_wan_enable_flag, sizeof(eth_wan_enable_flag))) - { - rc = strcmp_s(eth_wan_enable_flag, 5, "false", &strcmp_ret); - ERR_CHK(rc); - if (0 == strcmp_ret) - { - /* Better to have this done in service_wan generically. - * For now we will live with this, as this is required - * for MAPT devices. - */ - if ( CosaDmlMaptFlushDNSv4Entries() != STATUS_SUCCESS) - { - MAPT_LOG_ERROR("Failed to flush DNS v4 nameservers!"); - } - } - else - { - MAPT_LOG_INFO("Ethwan mode , bypassing CosaDmlMaptFlushDNSv4Entries()"); - } - } - /* Stopping UPnP, if mapt ratio is not 1:1 */ - if ( g_stMaptData.Ratio > 1 ) - { - CHAR isEnabled[BUFLEN_4] = {0}; - - if ( !syscfg_get(NULL, SYSCFG_UPNP_IGD_ENABLED, isEnabled, sizeof(isEnabled)) - && isEnabled[0] == '1') - { - pthread_t th_id; - MAPT_LOG_INFO("Stopping UPnP_IGD service, as MAPT ratio is higher"); - - if ( pthread_create(&th_id, NULL, &CosaDmlMaptSetUPnPIGDService, (PVOID)"false") ) - { - MAPT_LOG_ERROR("pthread create Failed, to stop UPnP_IGD Service!"); - } - } - } - - return STATUS_SUCCESS; -} - - -static RETURN_STATUS -CosaDmlMaptSetEvents -( - VOID -) -{ - CHAR eValue[BUFLEN_128] = {0}; - INT32 ret = 0; - errno_t rc = -1; - - MAPT_LOG_INFO("Entry"); - - ret |= commonSyseventSet (EVENT_MAPT_TRANSPORT_MODE, "MAPT"); - MAPT_LOG_NOTICE("MAP_MODE: MAPT"); - - ret |= commonSyseventSet (EVENT_MAPT_CONFIG_FLAG, "set"); - - rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.EaLen); - ERR_CHK(rc); - ret |= commonSyseventSet(EVENT_MAPT_EA_LENGTH, eValue); - - rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.Ratio); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_RATIO, eValue); - - rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.Psid); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_PSID_VALUE, eValue); - - rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.PsidLen); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_PSID_LENGTH, eValue); - - rc = sprintf_s(eValue, BUFLEN_128, "%u", g_stMaptData.PsidOffset); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_PSID_OFFSET, eValue); - - ret |= commonSyseventSet (EVENT_MAPT_IPADDRESS, g_stMaptData.IPv4AddrString); - - ret |= commonSyseventSet (EVENT_MAPT_IPV6_ADDRESS, g_stMaptData.IPv6AddrString); - - rc = sprintf_s(eValue, BUFLEN_128, "%s/%u", g_stMaptData.BrIPv6Prefix - , g_stMaptData.BrIPv6PrefixLen); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_BR_IPV6_PREFIX, eValue); - - rc = sprintf_s(eValue, BUFLEN_128, "%s/%u", g_stMaptData.RuleIPv4Prefix - , g_stMaptData.RuleIPv4PrefixLen); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_RULE_IPADDRESS, eValue); - - rc = sprintf_s(eValue, BUFLEN_128, "%s/%u", g_stMaptData.RuleIPv6Prefix - , g_stMaptData.RuleIPv6PrefixLen); - ERR_CHK(rc); - ret |= commonSyseventSet (EVENT_MAPT_RULE_IPV6_ADDRESS, eValue); - ret |= commonSyseventSet(EVENT_MAPT_IS_FMR, g_stMaptData.bFMR?"TRUE":"FALSE"); - - return ret? STATUS_FAILURE : STATUS_SUCCESS; -} - /* : : ___/ : | p bits | / q bits : @@ -814,7 +489,7 @@ CosaDmlMaptParseResponse UINT16 uiOptionLen = 0; UINT16 uiOption = 0; PUCHAR pCurOption = 0; - errno_t rc = -1; + int rc = -1; MAPT_LOG_INFO("Entry"); @@ -859,7 +534,7 @@ MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); g_stMaptData.RuleIPv4PrefixLen = *++pCurOption; pCurOption++; - rc = sprintf_s (g_stMaptData.RuleIPv4Prefix, sizeof(g_stMaptData.RuleIPv4Prefix), + rc = snprintf (g_stMaptData.RuleIPv4Prefix, sizeof(g_stMaptData.RuleIPv4Prefix), "%d.%d.%d.%d", pCurOption[0], pCurOption[1], pCurOption[2], pCurOption[3]); ERR_CHK(rc); @@ -869,10 +544,9 @@ MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); v6BitLen = g_stMaptData.RuleIPv6PrefixLen % 8; pCurOption++; - rc = memset_s (&v6Addr, BUFLEN_24, 0, sizeof(v6Addr)); + rc = memset (&v6Addr, 0, sizeof(v6Addr)); ERR_CHK(rc); - rc = memcpy_s (&v6Addr, BUFLEN_24, pCurOption, - (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); + rc = memcpy (&v6Addr, pCurOption, (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); ERR_CHK(rc); if ( v6BitLen ) @@ -880,7 +554,7 @@ MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); *((PCHAR)&v6Addr + v6ByteLen) &= 0xFF << (8 - v6BitLen); } - rc = memcpy_s (&g_stMaptData.RuleIPv6PrefixH, BUFLEN_24, v6Addr, + rc = memcpy (&g_stMaptData.RuleIPv6PrefixH, v6Addr, (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); ERR_CHK(rc); CosaDmlMaptGetIPv6StringFromHex (g_stMaptData.RuleIPv6PrefixH, @@ -972,9 +646,9 @@ MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); g_stMaptData.BrIPv6PrefixLen = *pCurOption++; /* RFC 6052: 2.2: g_stMaptData.BrIPv6PrefixLen%8 must be 0! */ - rc = memset_s (&ipv6Addr, BUFLEN_24, 0, sizeof(ipv6Addr)); + rc = memset (&ipv6Addr, 0, sizeof(ipv6Addr)); ERR_CHK(rc); - rc = memcpy_s (&ipv6Addr, BUFLEN_24, pCurOption, g_stMaptData.BrIPv6PrefixLen/8); + rc = memcpy (&ipv6Addr, pCurOption, g_stMaptData.BrIPv6PrefixLen/8); ERR_CHK(rc); CosaDmlMaptGetIPv6StringFromHex (ipv6Addr, g_stMaptData.BrIPv6Prefix); @@ -1013,18 +687,18 @@ CosaDmlMaptPrintConfig CHAR ruleIPv6Prefix[BUFLEN_40] = "\0"; CHAR pdIPv6Prefix[BUFLEN_40] = "\0"; CHAR brIPv6Prefix[BUFLEN_40] = "\0"; - errno_t rc = -1; + int rc = -1; - rc = sprintf_s (ruleIPv4Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv4Prefix + rc = snprintf (ruleIPv4Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv4Prefix , g_stMaptData.RuleIPv4PrefixLen); ERR_CHK(rc); - rc = sprintf_s (ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix + rc = snprintf (ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix , g_stMaptData.RuleIPv6PrefixLen); ERR_CHK(rc); - rc = sprintf_s (pdIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.PdIPv6Prefix + rc = snprintf (pdIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.PdIPv6Prefix , g_stMaptData.PdIPv6PrefixLen); ERR_CHK(rc); - rc = sprintf_s (brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix + rc = snprintf (brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix , g_stMaptData.BrIPv6PrefixLen); ERR_CHK(rc); @@ -1068,209 +742,6 @@ CosaDmlMaptPrintConfig return STATUS_SUCCESS; } - -static RETURN_STATUS -CosaDmlMaptResetClient -( - VOID -) -{ - MAPT_LOG_INFO("Entry"); - - FILE* fd = NULL; - CHAR outBuf[BUFLEN_256] = {0}; - - if ( (fd = v_secure_popen("r", "ps | grep udhcp | grep erouter0")) ) - { - if ( fgets(outBuf, BUFLEN_256, fd) && !strstr(outBuf, "erouter0") ) - { - if ( v_secure_system("service_wan dhcp-start") ) - { - MAPT_LOG_ERROR("Failed to restore dhclient !"); - v_secure_pclose(fd); - return STATUS_FAILURE; - } - } - v_secure_pclose(fd); - } - return STATUS_SUCCESS; -} - - -static RETURN_STATUS -CosaDmlMaptResetEvents -( - VOID -) -{ - MAPT_LOG_INFO("Entry"); - MAPT_LOG_NOTICE("MAP_MODE: NONE"); - return commonSyseventSet (EVENT_MAPT_TRANSPORT_MODE, "NONE") - - | commonSyseventSet (EVENT_MAPT_CONFIG_FLAG, "") - - | commonSyseventSet (EVENT_MAPT_EA_LENGTH, "") - - | commonSyseventSet (EVENT_MAPT_RATIO, "") - - | commonSyseventSet (EVENT_MAPT_PSID_VALUE, "") - - | commonSyseventSet (EVENT_MAPT_PSID_LENGTH, "") - - | commonSyseventSet (EVENT_MAPT_PSID_OFFSET, "") - - | commonSyseventSet (EVENT_MAPT_IPADDRESS, "") - - | commonSyseventSet (EVENT_MAPT_IPV6_ADDRESS, "") - - | commonSyseventSet (EVENT_MAPT_BR_IPV6_PREFIX, "") - - | commonSyseventSet (EVENT_MAPT_RULE_IPADDRESS, "") - - | commonSyseventSet (EVENT_MAPT_RULE_IPV6_ADDRESS, "") - - | commonSyseventSet(EVENT_MAPT_IS_FMR, ""); -} - - -static RETURN_STATUS -CosaDmlMaptResetConfig -( - VOID -) -{ - RETURN_STATUS ret = STATUS_SUCCESS; - FILE* fd = NULL; - CHAR outBuf[BUFLEN_64] = {0}; - errno_t rc = -1; - - MAPT_LOG_INFO("Entry"); - - if ( (fd = v_secure_popen("r","ip -4 route show | grep default | grep %s", MAPT_INTERFACE)) ) - { - if ( fgets(outBuf, BUFLEN_64, fd) && strstr(outBuf, MAPT_INTERFACE) ) - { - v_secure_system("ip route del default"); - } - v_secure_pclose(fd); - } - - if ( (fd = v_secure_popen("r","ip -4 route show | grep default | grep erouter0")) ) - { - rc = memset_s (&outBuf, BUFLEN_64, 0, sizeof(outBuf)); - ERR_CHK(rc); - - if ( !fgets(outBuf, BUFLEN_64, fd) || !strstr(outBuf, "erouter0") ) - { - if ( v_secure_system("ip ro rep default dev erouter0") ) - { - MAPT_LOG_ERROR("Failed to restore ip routes !"); - ret = STATUS_FAILURE; - } - } - v_secure_pclose(fd); - } - - if ( (fd = v_secure_popen("r", "lsmod | grep nat46")) ) - { - rc = memset_s (&outBuf, BUFLEN_64, 0, sizeof(outBuf)); - ERR_CHK(rc); - - if ( fgets(outBuf, BUFLEN_64, fd) && strstr(outBuf, "nat46") ) - { - if ( v_secure_system("rmmod nat46.ko") ) - { - MAPT_LOG_ERROR("Failed to remove nat46 module !"); - ret = STATUS_FAILURE; - } - } - v_secure_pclose(fd); - } - -#if defined (_COSA_BCM_ARM_) && defined (_XB6_PRODUCT_REQ_) - if ( !access("/proc/sys/net/flowmgr/disable_mapt_accel", F_OK) ) - { - if ( v_secure_system("echo 3 > /proc/sys/net/flowmgr/disable_mapt_accel") ) - { - MAPT_LOG_ERROR("Failed to disable mapt packet acceleration!"); - } - } - else - { - MAPT_LOG_WARNING("Mapt packet acceleration is not supported!"); - } -#endif - - return ret; -} - - -static RETURN_STATUS -CosaDmlMaptRollback -( - RB_STATE eState -) -{ - RETURN_STATUS ret = STATUS_SUCCESS; - MAPT_LOG_INFO("Entry"); - - if ( eState & RB_EVENTS ) - { - ret |= CosaDmlMaptResetEvents(); - MAPT_LOG_INFO("### Mapt events reset.") - } - if ( eState & RB_FIREWALL ) - { - ret |= commonSyseventSet (EVENT_FIREWALL_RESTART, NULL); - MAPT_LOG_INFO("### Mapt firewall reset.") - } - if ( eState & RB_CONFIG ) - { - ret |= CosaDmlMaptResetConfig(); - MAPT_LOG_INFO("### Mapt config reset.") - } - if ( eState & RB_DHCPCLIENT ) - { - ret |= CosaDmlMaptResetClient(); - MAPT_LOG_INFO("### Mapt dhclient reset.") - } - if ( eState & RB_UPNPIGD ) - { - CHAR isEnabled[BUFLEN_4] = {0}; - - syscfg_get(NULL, SYSCFG_UPNP_IGD_ENABLED, isEnabled, sizeof(isEnabled)); - - if ( isEnabled[0] == '1' ) - { - g_bEnableUPnPIGD = 0; - } - - if ( g_bEnableUPnPIGD ) - { - pthread_t th_id; - if ( pthread_create(&th_id, NULL, &CosaDmlMaptSetUPnPIGDService, (PVOID)"true") ) - { - MAPT_LOG_ERROR("pthread create Failed, to reset UPnP_IGD Service!"); - } - } - } - - if ( eState ) - { - errno_t rt = -1; - rt = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); - ERR_CHK(rt); - - if ( !g_bRollBackInProgress ) - { - MAPT_LOG_INFO("##### Mapt rollback complete #####"); - } - } - - return ret; -} - - static RETURN_STATUS CosaDmlMaptConvertStringToHexStream ( @@ -1312,272 +783,19 @@ MAPT_LOG_INFO("<<>> BufLen : %d", *uiOptionBufLen); return STATUS_SUCCESS; } -static RETURN_STATUS -CosaDmlMaptDisplayFeatureStatus -( - VOID -) -{ - RETURN_STATUS ret = STATUS_SUCCESS; - CHAR isEnabled[BUFLEN_4] = {0}; - - if ( !(ret|=syscfg_get(NULL, SYSCFG_UPNP_IGD_ENABLED, isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_UPnP_IGD_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_UPnP_IGD_disabled"); - } - } - *(PUINT32)isEnabled = 0; - - if ( !(ret|=syscfg_get(NULL, SYSCFG_DMZ_ENABLED, isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_UPnP_DMZ_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_DMZ_disabled"); - } - } - *(PUINT32)isEnabled = 0; - - if ( !(ret|=syscfg_get(NULL, SYSCFG_PORT_FORWARDING_ENABLED, isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_UPnP_Port_Forwarding_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_Port_Forwarding_disabled"); - } - } - *(PUINT32)isEnabled = 0; - - if ( !(ret|=syscfg_get(NULL, SYSCFG_PORT_TRIGGERING_ENABLED, isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_UPnP_Port_Triggering_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_Port_Triggering_disabled"); - } - } - *(PUINT32)isEnabled = 0; - - { - RETURN_STATUS ret2 = STATUS_SUCCESS; - - if ( !(ret2=syscfg_get(NULL, SYSCFG_MGMT_HTTP_ENABLED, isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_disabled"); - } - } -//#if defined(CONFIG_CCSP_WAN_MGMT_ACCESS) - else - if ( ret2 && - !(ret2=syscfg_get(NULL, SYSCFG_MGMT_HTTP_ENABLED"_ert", isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_http_disabled"); - } - } -//#endif - ret |= ret2; - } - *(PUINT32)isEnabled = 0; - - if ( !(ret|=syscfg_get(NULL, SYSCFG_MGMT_HTTPS_ENABLED, isEnabled, sizeof(isEnabled))) ) - { - if ( '1' == isEnabled[0] ) - { - MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_https_enabled"); - } - else - { - MAPT_LOG_INFO("MAP-T_enabled_User_Remote_Mgt_https_disabled"); - } - } - - return ret? STATUS_FAILURE : STATUS_SUCCESS; -} - - -/* - * External api definitions +/** + * @brief Parses the MAPT option 95 response. + * + * This function processes the MAPT option 95 response, extracts the relevant information and updates ipc_dhcpv6_data_t struct with mapt details + * + * @param[in] pPdIPv6Prefix Pointer to the IPv6 prefix. + * @param[in] pOptionBuf Pointer to the buffer containing the option 95 data. + * @param[out] dhcpv6_data Pointer to the structure where the parsed DHCPv6 data will be stored. + * + * @return ANSC_STATUS indicating the success or failure of the operation. */ -ANSC_STATUS -CosaDmlMaptProcessOpt95Response -( - PCHAR pPdIPv6Prefix, - PUCHAR pOptionBuf -) -{ - RETURN_STATUS ret = STATUS_SUCCESS; - UINT16 uiOptionBufLen = 0; - errno_t rc = -1; - - UINT prevCheckSum = s_Option95CheckSum; - - s_Option95CheckSum = CosaDmlMaptCalculateChecksum(pOptionBuf); - MAPT_LOG_INFO("Prev option95 checksum: %d, new option95 checksum: %d", prevCheckSum, s_Option95CheckSum); - if (s_Option95CheckSum == prevCheckSum) - { - MAPT_LOG_INFO("No change in received option95 data. No need to configure MAPT again!"); - return ret; - } - MAPT_LOG_INFO("Entry"); - - /* Check MAPT configuration, if already active, do rollback RB_ALL */ - if ( g_stMaptData.RuleIPv4Prefix[0] ) - { - MAPT_LOG_INFO("MAPT is configured already, hence calling mapt-Rollback !"); - g_bRollBackInProgress = 1; - if ( CosaDmlMaptRollback (RB_EVENTS|RB_FIREWALL|RB_CONFIG) != STATUS_SUCCESS ) - { - MAPT_LOG_ERROR("MAPT rollback failed !!"); - } - } - - /* Convert the received string buffer into hex stream */ - rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); - ERR_CHK(rc); - if ( CosaDmlMaptConvertStringToHexStream (pOptionBuf, &uiOptionBufLen) != STATUS_SUCCESS ) - { - MAPT_LOG_ERROR("MAPT string buffer to HexStream conversion Failed !!"); - ret = STATUS_FAILURE; - } - - /* Store IPv6 prefix and length */ - rc = memcpy_s (&g_stMaptData.PdIPv6Prefix, BUFLEN_40, pPdIPv6Prefix, - (strchr(pPdIPv6Prefix, '/') - pPdIPv6Prefix)); - ERR_CHK(rc); - g_stMaptData.PdIPv6PrefixLen = strtol((strchr(pPdIPv6Prefix, '/') + 1), NULL, 10); -MAPT_LOG_INFO("<<>> Received PdIPv6Prefix : %s/%u", g_stMaptData.PdIPv6Prefix - , g_stMaptData.PdIPv6PrefixLen); - if ( !ret && !g_stMaptData.PdIPv6Prefix[0] ) - { - MAPT_LOG_ERROR("PdIPv6Prefix is NULL !!"); - ret = STATUS_FAILURE; - } - - /* Parse the hex buffer for mapt options */ - if ( !ret && CosaDmlMaptParseResponse (pOptionBuf, uiOptionBufLen) != STATUS_SUCCESS ) - { - MAPT_LOG_ERROR("MAPT Parsing Response Failed !!"); - rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); - ERR_CHK(rc); - ret = STATUS_FAILURE; - } - - /* Derive IPv4 suffix and PSID value */ - if ( !ret && CosaDmlMaptComputePsidAndIPv4Suffix ( g_stMaptData.PdIPv6Prefix - , g_stMaptData.PdIPv6PrefixLen - , g_stMaptData.RuleIPv6PrefixLen - , g_stMaptData.RuleIPv4PrefixLen - , &g_stMaptData.Psid - , &g_stMaptData.PsidLen - , &g_stMaptData.IPv4Suffix) != STATUS_SUCCESS ) - { - MAPT_LOG_ERROR("MAPT Psid and IPv4 Suffix Computaion Failed !!"); - rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); - ERR_CHK(rc); - ret = STATUS_FAILURE; - } - - /* Calculate CE IPv4 Address */ - if ( !ret && CosaDmlMaptFormulateIPv4Address ( g_stMaptData.IPv4Suffix - , g_stMaptData.IPv4AddrString) != STATUS_SUCCESS) - { - MAPT_LOG_ERROR("MAPT Ipv4 Configuration Failed !!"); - rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); - ERR_CHK(rc); - ret = STATUS_FAILURE; - } - - /* Calculate CE IPv6 Address */ - if ( !ret && CosaDmlMaptFormulateIPv6Address ( g_stMaptData.PdIPv6Prefix - , g_stMaptData.IPv4AddrString - , g_stMaptData.Psid - , g_stMaptData.IPv6AddrString) != STATUS_SUCCESS) - { - MAPT_LOG_ERROR("MAPT Ipv6 Configuration Failed !!"); - rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); - ERR_CHK(rc); - ret = STATUS_FAILURE; - } - - if ( ret ) - { - if ( g_bRollBackInProgress ) - { - g_bRollBackInProgress = 0; - CosaDmlMaptRollback (RB_DHCPCLIENT|RB_UPNPIGD); - } - return ANSC_STATUS_FAILURE; - } - - /* Stop UPnP_IGD and DHCPv4 Client services */ - CosaDmlMaptStopServices(); - - /* set mapt sysevents and restart Firewall */ - if ( CosaDmlMaptSetEvents() ) - { - MAPT_LOG_ERROR("MAPT set events Failed !!"); - CosaDmlMaptRollback (RB_EVENTS|RB_DHCPCLIENT|RB_UPNPIGD); - return ANSC_STATUS_FAILURE; - } - - /* Load nat46 module and configure */ - if ( CosaDmlMaptApplyConfig() ) - { - MAPT_LOG_ERROR("MAPT Apply Configurations Failed !!"); - CosaDmlMaptRollback (RB_CONFIG|RB_EVENTS|RB_DHCPCLIENT|RB_UPNPIGD); - return ANSC_STATUS_FAILURE; - } - - /* Restarting firewall to apply mapt rules */ - MAPT_LOG_INFO("MAPT events are set. Triggering firewall-restart"); - commonSyseventSet (EVENT_FIREWALL_RESTART, NULL); - - MAPT_LOG_INFO("Triggering ntpd-restart"); - commonSyseventSet (EVENT_NTPD_RESTART, NULL); - - /* Display port based features' status */ - if ( CosaDmlMaptDisplayFeatureStatus() ) - { - MAPT_LOG_ERROR("MAPT get(syscfg) feature status Failed!"); - } - - CosaDmlMaptPrintConfig(); - - MAPT_LOG_INFO("MAPT configuration complete.\n"); - - return ANSC_STATUS_SUCCESS; -} -#if defined(MAPT_UNIFICATION_ENABLED) -ANSC_STATUS -CosaDmlMaptParseOpt95Response +ANSC_STATUS WanMgr_MaptParseOpt95Response ( PCHAR pPdIPv6Prefix, PUCHAR pOptionBuf, @@ -1586,12 +804,12 @@ CosaDmlMaptParseOpt95Response { RETURN_STATUS ret = STATUS_SUCCESS; UINT16 uiOptionBufLen = 0; - errno_t rc = -1; + int rc = -1; MAPT_LOG_INFO("Entry"); /* Convert the received string buffer into hex stream */ - rc = memset_s (&g_stMaptData, sizeof(g_stMaptData), 0, sizeof(g_stMaptData)); + rc = memset (&g_stMaptData, 0, sizeof(g_stMaptData)); ERR_CHK(rc); if ( CosaDmlMaptConvertStringToHexStream (pOptionBuf, &uiOptionBufLen) != STATUS_SUCCESS ) { @@ -1600,7 +818,7 @@ CosaDmlMaptParseOpt95Response } /* Store IPv6 prefix and length */ - rc = memcpy_s (&g_stMaptData.PdIPv6Prefix, BUFLEN_40, pPdIPv6Prefix, + rc = memcpy (&g_stMaptData.PdIPv6Prefix, pPdIPv6Prefix, (strchr(pPdIPv6Prefix, '/') - pPdIPv6Prefix)); ERR_CHK(rc); g_stMaptData.PdIPv6PrefixLen = strtol((strchr(pPdIPv6Prefix, '/') + 1), NULL, 10); @@ -1664,14 +882,14 @@ CosaDmlMaptParseOpt95Response dhcpv6_data->mapt.iapdPrefixLen = g_stMaptData.PdIPv6PrefixLen; dhcpv6_data->mapt.ratio = g_stMaptData.Ratio; - rc = sprintf_s (dhcpv6_data->mapt.pdIPv6Prefix, BUFLEN_40, "%s", g_stMaptData.PdIPv6Prefix); + rc = snprintf (dhcpv6_data->mapt.pdIPv6Prefix, BUFLEN_40, "%s", g_stMaptData.PdIPv6Prefix); ERR_CHK(rc); - rc = sprintf_s (dhcpv6_data->mapt.ruleIPv4Prefix, BUFLEN_40, "%s", g_stMaptData.RuleIPv4Prefix); + rc = snprintf (dhcpv6_data->mapt.ruleIPv4Prefix, BUFLEN_40, "%s", g_stMaptData.RuleIPv4Prefix); ERR_CHK(rc); - rc = sprintf_s (dhcpv6_data->mapt.ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix + rc = snprintf (dhcpv6_data->mapt.ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix , g_stMaptData.RuleIPv6PrefixLen); ERR_CHK(rc); - rc = sprintf_s (dhcpv6_data->mapt.brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix + rc = snprintf (dhcpv6_data->mapt.brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix , g_stMaptData.BrIPv6PrefixLen); ERR_CHK(rc); @@ -1682,4 +900,3 @@ CosaDmlMaptParseOpt95Response return ((ret) ? ANSC_STATUS_FAILURE : ANSC_STATUS_SUCCESS); } -#endif /** MAPT_UNIFICATION_ENABLED */ diff --git a/source/WanManager/MaptParsing/cosa_mapt_apis.h b/source/WanManager/MaptParsing/cosa_mapt_apis.h index d351d878..859e4e8c 100644 --- a/source/WanManager/MaptParsing/cosa_mapt_apis.h +++ b/source/WanManager/MaptParsing/cosa_mapt_apis.h @@ -59,15 +59,11 @@ **************************************************************************/ -#if defined(FEATURE_SUPPORT_MAPT_NAT46) || defined(MAPT_UNIFICATION_ENABLED) #ifndef _COSA_MAPT_APIS_H #define _COSA_MAPT_APIS_H -#include "cosa_apis.h" -#if defined(FEATURE_RDKB_WAN_MANAGER) #include "ipc_msg.h" -#endif #define COSA_MAPT_SYSCFG_NAMESPACE "CosaMAPT" #define COSA_MAPT_ID_SYSCFG_NAMESPACE COSA_MAPT_SYSCFG_NAMESPACE"IDs" @@ -272,35 +268,22 @@ _COSA_DML_MAPT_OPTION UINT16 OptLen; } __attribute__ ((__packed__)) COSA_DML_MAPT_OPTION, *PCOSA_DML_MAPT_OPTION; -/************************************* - The actual function declaration -**************************************/ -/* - * Description: - * This routine parses the option-95 response and sets the configs required. - * Arguments: - * pPdIPv6Prefix Obtained IPv6 prefix through prefix delegation. - * uiPdIPv6PrefixLen IPv6 prefix length. - * pOptionBuf Buffer containing option-95 response. - * uiOptionBufLen Response buffer length. - * Return: - * Status of operation. +/** + * @brief Parses the MAPT option 95 response. + * + * This function processes the MAPT option 95 response, extracts the relevant information and updates ipc_dhcpv6_data_t struct with mapt details + * + * @param[in] pPdIPv6Prefix Pointer to the IPv6 prefix. + * @param[in] pOptionBuf Pointer to the buffer containing the option 95 data. + * @param[out] dhcpv6_data Pointer to the structure where the parsed DHCPv6 data will be stored. + * + * @return ANSC_STATUS indicating the success or failure of the operation. */ -ANSC_STATUS -CosaDmlMaptProcessOpt95Response - ( - PCHAR pPdIPv6Prefix, - PUCHAR pOptionBuf - ); - -#if defined(MAPT_UNIFICATION_ENABLED) -ANSC_STATUS -CosaDmlMaptParseOpt95Response + +ANSC_STATUS WanMgr_MaptParseOpt95Response ( PCHAR pPdIPv6Prefix, PUCHAR pOptionBuf, ipc_dhcpv6_data_t *dhcpv6_data ); -#endif /** MAPT_UNIFICATION_ENABLED */ -#endif #endif diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index f6c526a9..73f12fc2 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1910,6 +1910,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) #ifdef FEATURE_MAPT_DEBUG MaptInfo("--------- Got a new event in Wanmanager for MAPT_CONFIG ---------"); #endif + +#if defined (MAPT_UNIFICATION_ENABLED) + //In MAPT unified builds, MAPT option 95 is parsed within WanManager. To ensure consistent MAPT processing, populate the IPC message structure similarly to how MAPT data is shared in the IPC message. + //In the ipc_mapt_data_t structure, opt95_dBuf and mapt are union members. Copy to a temporary variable before parsing. + unsigned char temp_opt95_dBuf[BUFLEN_256] = {0}; + memcpy(temp_opt95_dBuf, pNewIpcMsg->opt95_dBuf, sizeof(temp_opt95_dBuf)); + WanMgr_MaptParseOpt95Response(pNewIpcMsg->sitePrefix, temp_opt95_dBuf, pNewIpcMsg); +#endif //get MAP-T previous data memcpy(&dhcp6cMAPTMsgBodyPrvs, &(pVirtIf->MAP.dhcp6cMAPTparameters), sizeof(ipc_mapt_data_t)); From c809027c6bbb3f6cb7eeaddcf4036971ca1a5c28 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Tue, 22 Oct 2024 16:29:46 +0000 Subject: [PATCH 31/64] Solving compilation error in Configurable wna name disabled builds Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 73f12fc2..766f605b 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1690,6 +1690,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); Ipv6DataNew.addrAssigned = true; + pNewIpcMsg->addrAssigned = true; Ipv6DataNew.addrCmd = pDhcp6cInfoCur->addrCmd; } @@ -1829,7 +1830,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) * * use this message as a trigger to check the WAN interface IP. * * Maybe we've been assigned an address by SLAAC.*/ - if (!Ipv6DataNew.addrAssigned) + if (!pNewIpcMsg->addrAssigned) { char guAddrPrefix[IP_ADDR_LENGTH] = {0}; char guAddr[IP_ADDR_LENGTH] = {0}; From 78211dbf4b3f9d50c97ab255e620ee68b00a1252 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Tue, 22 Oct 2024 16:36:53 +0000 Subject: [PATCH 32/64] Deleting temp make file Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/MaptParsing/Makefile.am | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 source/WanManager/MaptParsing/Makefile.am diff --git a/source/WanManager/MaptParsing/Makefile.am b/source/WanManager/MaptParsing/Makefile.am deleted file mode 100644 index b179d701..00000000 --- a/source/WanManager/MaptParsing/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -bin_PROGRAMS = wanmanager - -wanmanager_SOURCES =cosa_mapt_apis.o From d65deed880c65b719a639303749fd0125b35e97f Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Wed, 23 Oct 2024 15:49:23 +0000 Subject: [PATCH 33/64] RDKB-57269 : Moving DHCPv6 client message handler API to WanManager Signed-off-by: S-Parthiban-Selvaraj --- configure.ac | 12 +- .../dhcpv6c_msg_apis.c} | 341 ++++++++++++++++-- .../dhcpv6c_msg_apis.h} | 40 +- source/WanManager/Makefile.am | 4 +- source/WanManager/wanmgr_ipc.c | 6 + 5 files changed, 329 insertions(+), 74 deletions(-) rename source/WanManager/{MaptParsing/cosa_mapt_apis.c => DHCPv6cMsgHandler/dhcpv6c_msg_apis.c} (71%) rename source/WanManager/{MaptParsing/cosa_mapt_apis.h => DHCPv6cMsgHandler/dhcpv6c_msg_apis.h} (87%) diff --git a/configure.ac b/configure.ac index fac94f2c..41492e9c 100644 --- a/configure.ac +++ b/configure.ac @@ -89,17 +89,17 @@ AC_ARG_ENABLE([gtestapp], [echo "Gtestapp is disabled"]) AM_CONDITIONAL([WITH_GTEST_SUPPORT], [test x$GTEST_SUPPORT_ENABLED = xtrue]) -AC_ARG_ENABLE([maptunificationsupport], - AS_HELP_STRING([--enable-maptunificationsupport],[enable mapt unification support (default is no)]), +AC_ARG_ENABLE([wanunificationsupport], + AS_HELP_STRING([--enable-wanunificationsupport],[enable wan unification support (default is no)]), [ case "${enableval}" in - yes) MAPT_UNIFICATION_SUPPORT_ENABLED=true;; - no) MAPT_UNIFICATION_SUPPORT_ENABLED=false;; - *) AC_MSG_ERROR([bad value ${enableval} for --enable-maptunificationsupport ]);; + yes) WAN_UNIFICATION_SUPPORT_ENABLED=true;; + no) WAN_UNIFICATION_SUPPORT_ENABLED=false;; + *) AC_MSG_ERROR([bad value ${enableval} for --enable-wanunificationsupport ]);; esac ], [echo "mapt unification is disabled"]) -AM_CONDITIONAL(MAPT_UNIFICATION_ENABLED, test "x$MAPT_UNIFICATION_SUPPORT_ENABLED" = xtrue) +AM_CONDITIONAL(WAN_UNIFICATION_ENABLED, test "x$WAN_UNIFICATION_SUPPORT_ENABLED" = xtrue) dnl Checks for header files. AC_CHECK_HEADERS([limits.h memory.h stdlib.h string.h sys/socket.h unistd.h]) diff --git a/source/WanManager/MaptParsing/cosa_mapt_apis.c b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c similarity index 71% rename from source/WanManager/MaptParsing/cosa_mapt_apis.c rename to source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c index 3ec8a2a2..1118c55f 100644 --- a/source/WanManager/MaptParsing/cosa_mapt_apis.c +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c @@ -33,38 +33,6 @@ limitations under the License. **********************************************************************/ -/************************************************************************** - - module: cosa_mapt_apis.c - - For COSA Data Model Library Development. - - ------------------------------------------------------------------- - - description: - - This file implementes back-end apis for the COSA Data Model Library - - ------------------------------------------------------------------- - - environment: - - platform independent - - ------------------------------------------------------------------- - - author: - - COSA XML TOOL CODE GENERATOR 1.0 - - ------------------------------------------------------------------- - - revision: - - 12/07/2021 initial revision. - - -**************************************************************************/ #include #include #include @@ -83,8 +51,10 @@ #include #include "ccsp_psm_helper.h" #include "sys_definitions.h" -#include "cosa_mapt_apis.h" #include "secure_wrapper.h" + +#include "wanmgr_dml.h" +#include "dhcpv6c_msg_apis.h" /* * Macro definitions */ @@ -105,6 +75,8 @@ #define STRING_TO_HEX(pStr) ( (pStr-'a'<0)? (pStr-'A'<0)? pStr-'0' : pStr-'A'+10 : pStr-'a'+10 ) #define ERR_CHK(x) +#define CCSP_COMMON_FIFO "/tmp/ccsp_common_fifo" + /* * Static function prototypes */ @@ -136,10 +108,10 @@ static PVOID CosaDmlMaptSetUPnPIGDService (PVOID arg); */ static COSA_DML_MAPT_DATA g_stMaptData; static volatile UINT8 g_bEnableUPnPIGD; -static UINT8 g_bRollBackInProgress; -static UINT s_Option95CheckSum = 0; extern ANSC_HANDLE bus_handle; +extern int sysevent_fd; +extern token_t sysevent_token; /* * Static function definitions */ @@ -703,7 +675,7 @@ CosaDmlMaptPrintConfig ERR_CHK(rc); MAPT_LOG_INFO("\r" - "+-------------------------------------------------------------+%15s\n" + "+-------------------------------------------------------------+\n" "| MAP-T Configuration |\n" "+-------------------+-----------------------------------------+",""); MAPT_LOG_INFO("\r" @@ -714,28 +686,28 @@ CosaDmlMaptPrintConfig , g_stMaptData.EaLen , g_stMaptData.Psid); MAPT_LOG_INFO("\r" - "| psidlen | %-40u" "|%15s\n" + "| psidlen | %-40u" "|\n" "| psid offset | %-40u" "|\n" "| ratio | %-40u" "|" , g_stMaptData.PsidLen, "" , g_stMaptData.PsidOffset , g_stMaptData.Ratio); MAPT_LOG_INFO("\r" - "| rule ipv4 prefix | %-40s" "|%15s\n" + "| rule ipv4 prefix | %-40s" "|\n" "| rule ipv6 prefix | %-40s" "|\n" "| ipv6 prefix | %-40s" "|" , ruleIPv4Prefix, "" , ruleIPv6Prefix , pdIPv6Prefix); MAPT_LOG_INFO("\r" - "| br ipv6 prefix | %-40s" "|%15s\n" + "| br ipv6 prefix | %-40s" "|\n" "| ipv4 suffix | %-40u" "|\n" "| map ipv4 address | %-40s" "|" , brIPv6Prefix, "" , g_stMaptData.IPv4Suffix , g_stMaptData.IPv4AddrString); MAPT_LOG_INFO("\r" - "| map ipv6 address | %-40s" "|%15s\n" + "| map ipv6 address | %-40s" "|\n" "+-------------------+-----------------------------------------+\n" , g_stMaptData.IPv6AddrString, ""); @@ -900,3 +872,292 @@ ANSC_STATUS WanMgr_MaptParseOpt95Response return ((ret) ? ANSC_STATUS_FAILURE : ANSC_STATUS_SUCCESS); } + + + +int remove_single_quote (char *buf) +{ + int i = 0; + int j = 0; + + while (buf[i] != '\0' && i < 255) { + if (buf[i] != '\'') { + buf[j++] = buf[i]; + } + i++; + } + buf[j] = '\0'; + return 0; +} + +typedef struct +{ + char* value; // Pointer to the IANA/IAPD value etc.. + char* eventName; // Corresponding event name +} Ipv6SyseventMap; + +/* processIpv6LeaseSysevents() + * This funtion is used to set the IPv6 lease related sysevents + */ +void processIpv6LeaseSysevents(Ipv6SyseventMap* eventMaps, size_t size, const char* IfaceName) +{ + + // Loop through the eventMaps array + for (size_t i = 0; i < size; i++) + { + if (eventMaps[i].value[0] != '\0' && strcmp(eventMaps[i].value, "\'\'") != 0) + { + char sysEventName[256] = {0}; + remove_single_quote(eventMaps[i].value); + snprintf(sysEventName, sizeof(sysEventName), eventMaps[i].eventName, IfaceName); + CcspTraceInfo(("%s - %d: Setting sysevent %s to %s \n", __FUNCTION__, __LINE__, sysEventName, eventMaps[i].value)); + sysevent_set(sysevent_fd, sysevent_token, sysEventName, eventMaps[i].value, 0); + } + } +} + +/* This thread is used to parse the Ipv6 lease iformation sent by the DHCPv6 clients and sends the information to WanManager. + * + */ +static void * WanMgr_DhcpV6MsgHandler() +{ + int fd=0 ; + char msg[1024]; + char * p = NULL; + + CcspTraceInfo(("%s - %d: created (WanManager Unified Version) ", __FUNCTION__, __LINE__)); + + fd_set rfds; + struct timeval tm; + fd= open(CCSP_COMMON_FIFO, O_RDWR); + if (fd< 0) + { + CcspTraceError(("%s - %d: open common fifo!!!!!!!!!!!! : %s . Exit thread", __FUNCTION__, __LINE__, strerror(errno))); + pthread_exit(NULL); + } + while (1) + { + int retCode = 0; + tm.tv_sec = 60; + tm.tv_usec = 0; + + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + retCode = select(fd+1, &rfds, NULL, NULL, &tm); + /* When return -1, it's error. + When return 0, it's timeout + When return >0, it's the number of valid fds */ + if (retCode < 0) { + fprintf(stderr, "dbg_thrd : select returns error \n" ); + if (errno == EINTR) + continue; + + CcspTraceWarning(("%s -- select(): %s. Exit thread", __FUNCTION__, strerror(errno))); + pthread_exit(NULL); + } + else if(retCode == 0 ) + continue; + + if ( FD_ISSET(fd, &rfds) ) + { + ssize_t msg_len = 0; + msg[0] = 0; + msg_len = read(fd, msg, sizeof(msg)-1); + if(msg_len > 0) + msg[msg_len] = 0; + } + else + continue; + + if (msg[0] != 0) + { + CcspTraceInfo(("%s: get message %s\n", __func__, msg)); + } else { + //Message is empty. Wait 5 sec before trying the select again. + sleep(5); + continue; + } + + if (!strncmp(msg, "dibbler-client", strlen("dibbler-client"))) + { + //Interface name + char IfaceName[64] = {0}; + //Action (add or delete) + char action[64] = {0}; + //IANA related varibales + char v6addr[64] = {0}, iana_t1[32] = {0}, iana_t2[32] = {0}, iana_iaid[32] = {0}, iana_pretm[32] = {0}, iana_vldtm[32] = {0}; + //IAPD related varibales + char v6pref[128] = {0}, preflen[12] = {0}, iapd_t1[32] = {0}, iapd_t2[32] = {0}, iapd_iaid[32] = {0}, iapd_pretm[32] = {0}, iapd_vldtm[32] = {0}; + int pref_len = 0; + + p = msg+strlen("dibbler-client"); + while(isblank(*p)) p++; + fprintf(stderr, "%s -- %d !!! get event from v6 client: %s \n", __FUNCTION__, __LINE__,p); +#if defined (MAPT_UNIFICATION_ENABLED) + unsigned char opt95_dBuf[BUFLEN_256] = {0}; + int dataLen = sscanf(p, "%63s %63s %63s %31s %31s %31s %31s %31s %63s %11s %31s %31s %31s %31s %31s %255s", + action, IfaceName, v6addr, iana_iaid, iana_t1, iana_t2, iana_pretm, iana_vldtm, + v6pref, preflen, iapd_iaid, iapd_t1, iapd_t2, iapd_pretm, iapd_vldtm, + opt95_dBuf); + CcspTraceDebug(("%s,%d: dataLen = %d\n", __FUNCTION__, __LINE__, dataLen)); + if (dataLen == 16) +#else // MAPT_UNIFICATION_ENABLED + int dataLen = sscanf(p, "%63s %63s %63s %31s %31s %31s %31s %31s %63s %11s %31s %31s %31s %31s %31s", + action, IfaceName, v6addr, iana_iaid, iana_t1, iana_t2, iana_pretm, iana_vldtm, + v6pref, preflen, iapd_iaid, iapd_t1, iapd_t2, iapd_pretm, iapd_vldtm); + CcspTraceDebug(("%s,%d: dataLen = %d\n", __FUNCTION__, __LINE__, dataLen)); + if (dataLen == 15) +#endif + { + remove_single_quote(v6addr); + remove_single_quote(v6pref); + remove_single_quote(preflen); + remove_single_quote(IfaceName); + pref_len = atoi(preflen); + CcspTraceDebug(("%s,%d: v6addr=%s, v6pref=%s, pref_len=%d\n", __FUNCTION__, __LINE__, v6addr, v6pref, pref_len)); + + if (!strncmp(action, "add", 3)) + { + CcspTraceInfo(("%s: add\n", __func__)); + //TODO : Waiting until private lan interface is ready ? + // Waiting until private lan interface is ready , so that we can assign global ipv6 address and also start dhcp server. + + ipc_dhcpv6_data_t dhcpv6_data; + memset(&dhcpv6_data, 0, sizeof(ipc_dhcpv6_data_t)); + strncpy(dhcpv6_data.ifname, IfaceName, sizeof(dhcpv6_data.ifname)); + if(strlen(v6pref) == 0 && strlen(v6addr) ==0) + { + dhcpv6_data.isExpired = TRUE; + } else + { + dhcpv6_data.isExpired = FALSE; + //Reset MAP flags + dhcpv6_data.maptAssigned = FALSE; + dhcpv6_data.mapeAssigned = FALSE; + if(strlen(v6pref) > 0 && strncmp(v6pref, "\\0",2)!=0) + { + CcspTraceInfo(("%s %d Prefix Assigned\n", __FUNCTION__, __LINE__)); + snprintf(dhcpv6_data.sitePrefix, sizeof(dhcpv6_data.sitePrefix), "%s/%d", v6pref, pref_len); + + dhcpv6_data.prefixAssigned = TRUE; + strncpy(dhcpv6_data.pdIfAddress, "", sizeof(dhcpv6_data.pdIfAddress)); + dhcpv6_data.prefixCmd = 0; + remove_single_quote(iapd_pretm); + remove_single_quote(iapd_vldtm); + sscanf(iapd_pretm, "%d", &(dhcpv6_data.prefixPltime)); + sscanf(iapd_vldtm, "%d", &(dhcpv6_data.prefixVltime)); + + //IPv6 prefix related sysevents + // Define the eventMaps array as before + Ipv6SyseventMap eventMaps[] = { + {dhcpv6_data.sitePrefix, COSA_DML_WANIface_PREF_SYSEVENT_NAME}, + {iapd_iaid, COSA_DML_WANIface_PREF_IAID_SYSEVENT_NAME}, + {iapd_t1, COSA_DML_WANIface_PREF_T1_SYSEVENT_NAME}, + {iapd_t2, COSA_DML_WANIface_PREF_T2_SYSEVENT_NAME}, + {iapd_pretm,COSA_DML_WANIface_PREF_PRETM_SYSEVENT_NAME}, + {iapd_vldtm,COSA_DML_WANIface_PREF_VLDTM_SYSEVENT_NAME} + }; + /* Set Interface specific sysevnts. This is used for Ip interface DM */ + processIpv6LeaseSysevents(eventMaps, sizeof(eventMaps) / sizeof(eventMaps[0]), IfaceName); + +#if defined (MAPT_UNIFICATION_ENABLED) + if (opt95_dBuf[0] == '\0' || strlen((char*)opt95_dBuf) <=0 || strcmp((char*)opt95_dBuf, "\'\'") == 0) + { + CcspTraceInfo(("%s: MAP-T configuration not available.\n", __FUNCTION__)); + } + else + { + WanMgr_MaptParseOpt95Response(dhcpv6_data.sitePrefix, opt95_dBuf, &dhcpv6_data); + } +#endif // MAPT_UNIFICATION_ENABLED + } + + if(strlen(v6addr) > 0 && strncmp(v6addr, "\\0",2)!=0) + { + CcspTraceInfo(("%s %d Addr Assigned\n", __FUNCTION__, __LINE__)); + dhcpv6_data.addrAssigned = TRUE; + strncpy(dhcpv6_data.address, v6addr, sizeof(dhcpv6_data.address)-1); + dhcpv6_data.addrCmd = 0; + + //IPv6 IANA related sysevents + // Define the eventMaps array as before + Ipv6SyseventMap eventMaps[] = { + {v6addr, COSA_DML_WANIface_ADDR_SYSEVENT_NAME}, + {iana_iaid, COSA_DML_WANIface_ADDR_IAID_SYSEVENT_NAME}, + {iana_t1, COSA_DML_WANIface_ADDR_T1_SYSEVENT_NAME}, + {iana_t2, COSA_DML_WANIface_ADDR_T2_SYSEVENT_NAME}, + {iana_pretm,COSA_DML_WANIface_ADDR_PRETM_SYSEVENT_NAME}, + {iana_vldtm,COSA_DML_WANIface_ADDR_VLDTM_SYSEVENT_NAME}, + }; + + /* Set Interface specific sysevnts. This is used for Ip interface DM */ + processIpv6LeaseSysevents(eventMaps, sizeof(eventMaps) / sizeof(eventMaps[0]), IfaceName); + } + + /** DNS servers. **/ + char dns_server[256] = {'\0'}; + //DNS server details are shared using sysvent, it is not part of the dibbler fifo + sysevent_get(sysevent_fd, sysevent_token, "ipv6_nameserver", dns_server, sizeof(dns_server)); + if (strlen(dns_server) != 0) + { + dhcpv6_data.dnsAssigned = TRUE; + sscanf (dns_server, "%s %s", dhcpv6_data.nameserver, dhcpv6_data.nameserver1); + } + } + + //get iface data + DML_VIRTUAL_IFACE* pVirtIf = WanMgr_GetVIfByName_VISM_running_locked(dhcpv6_data.ifname); + if(pVirtIf != NULL) + { + //check if previously message was already handled + if(pVirtIf->IP.pIpcIpv6Data == NULL) + { + //allocate + pVirtIf->IP.pIpcIpv6Data = (ipc_dhcpv6_data_t*) malloc(sizeof(ipc_dhcpv6_data_t)); + if(pVirtIf->IP.pIpcIpv6Data != NULL) + { + // copy data + memcpy(pVirtIf->IP.pIpcIpv6Data, &dhcpv6_data, sizeof(ipc_dhcpv6_data_t)); + } + } + //release lock + WanMgr_VirtualIfaceData_release(pVirtIf); + } + + + } + else if (!strncmp(action, "del", 3)) + { + /*todo*/ + } + } + } + } + if(fd>=0) { + close(fd); + } + return NULL; +} + +ANSC_STATUS WanMgr_DhcpV6MsgHandlerInit() +{ + ANSC_STATUS retStatus = ANSC_STATUS_FAILURE; + int ret = -1; + + //create thread + pthread_t ipv6LeaseParser; + ret = pthread_create( &ipv6LeaseParser, NULL, &WanMgr_DhcpV6MsgHandler, NULL ); + + if( 0 != ret ) + { + CcspTraceInfo(("%s %d - Failed to start WanMgr_DhcpV6MsgHandler Thread Error:%d\n", __FUNCTION__, __LINE__, ret)); + } + else + { + CcspTraceInfo(("%s %d - WanMgr_DhcpV6MsgHandler Thread Started Successfully\n", __FUNCTION__, __LINE__)); + retStatus = ANSC_STATUS_SUCCESS; + } + return retStatus ; +} + + diff --git a/source/WanManager/MaptParsing/cosa_mapt_apis.h b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h similarity index 87% rename from source/WanManager/MaptParsing/cosa_mapt_apis.h rename to source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h index 859e4e8c..bb8c2e96 100644 --- a/source/WanManager/MaptParsing/cosa_mapt_apis.h +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h @@ -33,32 +33,6 @@ limitations under the License. **********************************************************************/ -/************************************************************************** - - module: cosa_mapt_apis.h - - For COSA Data Model Library Development. - - ------------------------------------------------------------------- - - description: - - This file implementes back-end apis for the COSA Data Model Library - - ------------------------------------------------------------------- - - author: - - COSA XML TOOL CODE GENERATOR 1.0 - - ------------------------------------------------------------------- - - revision: - - 12/07/2021 initial revision. - - -**************************************************************************/ #ifndef _COSA_MAPT_APIS_H #define _COSA_MAPT_APIS_H @@ -211,6 +185,20 @@ #define MAPT_LOG_WARNING(format, ...) \ CcspTraceWarning(("%s - "format"\n", __FUNCTION__, ##__VA_ARGS__)) +#define COSA_DML_WANIface_PREF_SYSEVENT_NAME "tr_%s_dhcpv6_client_v6pref" +#define COSA_DML_WANIface_PREF_IAID_SYSEVENT_NAME "tr_%s_dhcpv6_client_pref_iaid" +#define COSA_DML_WANIface_PREF_T1_SYSEVENT_NAME "tr_%s_dhcpv6_client_pref_t1" +#define COSA_DML_WANIface_PREF_T2_SYSEVENT_NAME "tr_%s_dhcpv6_client_pref_t2" +#define COSA_DML_WANIface_PREF_PRETM_SYSEVENT_NAME "tr_%s_dhcpv6_client_pref_pretm" +#define COSA_DML_WANIface_PREF_VLDTM_SYSEVENT_NAME "tr_%s_dhcpv6_client_pref_vldtm" + +#define COSA_DML_WANIface_ADDR_SYSEVENT_NAME "tr_%s_dhcpv6_client_v6addr" +#define COSA_DML_WANIface_ADDR_IAID_SYSEVENT_NAME "tr_%s_dhcpv6_client_addr_iaid" +#define COSA_DML_WANIface_ADDR_T1_SYSEVENT_NAME "tr_%s_dhcpv6_client_addr_t1" +#define COSA_DML_WANIface_ADDR_T2_SYSEVENT_NAME "tr_%s_dhcpv6_client_addr_t2" +#define COSA_DML_WANIface_ADDR_PRETM_SYSEVENT_NAME "tr_%s_dhcpv6_client_addr_pretm" +#define COSA_DML_WANIface_ADDR_VLDTM_SYSEVENT_NAME "tr_%s_dhcpv6_client_addr_vldtm" + /* * Enums and structure definition */ diff --git a/source/WanManager/Makefile.am b/source/WanManager/Makefile.am index 6437c426..a9d516e4 100644 --- a/source/WanManager/Makefile.am +++ b/source/WanManager/Makefile.am @@ -34,7 +34,7 @@ wanmanager_SOURCES = wanmgr_webconfig_apis.c wanmgr_webconfig.c wanmgr_main.c w wanmanager_LDADD = $(wanmanager_DEPENDENCIES) -lccsp_common -lrdkloggers $(DBUS_LIBS) $(SYSTEMD_LDFLAGS) -lhal_platform -lapi_dhcpv4c -lnanomsg -lwebconfig_framework -lmsgpackc -ldhcp_client_utils -lprivilege -lrbus -lsecure_wrapper -if MAPT_UNIFICATION_ENABLED -wanmanager_SOURCES += MaptParsing/cosa_mapt_apis.c +if WAN_UNIFICATION_ENABLED +wanmanager_SOURCES += DHCPv6cMsgHandler/dhcpv6c_msg_apis.c endif diff --git a/source/WanManager/wanmgr_ipc.c b/source/WanManager/wanmgr_ipc.c index 15e1ea4c..058891dc 100644 --- a/source/WanManager/wanmgr_ipc.c +++ b/source/WanManager/wanmgr_ipc.c @@ -485,6 +485,12 @@ ANSC_STATUS WanMgr_StartIpcServer() CcspTraceInfo(("%s %d - IPC Thread Started Successfully\n", __FUNCTION__, __LINE__)); retStatus = ANSC_STATUS_SUCCESS; } + +#if defined(WAN_MANAGER_UNIFICATION_ENABLED) && !defined( RDKB_EXTENDER_ENABLED) + //TODO: XLE is still using the OLD dhcpv6c_dbg_thrd thread + WanMgr_DhcpV6MsgHandlerInit(); +#endif + return retStatus ; } From 38038daf088c43a06964983a90f39bbe792d980b Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Thu, 24 Oct 2024 10:04:53 +0000 Subject: [PATCH 34/64] WanMgr_MaptParseOpt95Response cleanup Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h | 4 ++-- source/WanManager/wanmgr_dhcpv6_apis.c | 7 ------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h index bb8c2e96..1a11a7d5 100644 --- a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h @@ -33,8 +33,8 @@ limitations under the License. **********************************************************************/ -#ifndef _COSA_MAPT_APIS_H -#define _COSA_MAPT_APIS_H +#ifndef _DHCPV6_MSG_APIS_H +#define _DHCPV6_MSG_APIS_H #include "ipc_msg.h" diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 766f605b..c156792c 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1912,13 +1912,6 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) MaptInfo("--------- Got a new event in Wanmanager for MAPT_CONFIG ---------"); #endif -#if defined (MAPT_UNIFICATION_ENABLED) - //In MAPT unified builds, MAPT option 95 is parsed within WanManager. To ensure consistent MAPT processing, populate the IPC message structure similarly to how MAPT data is shared in the IPC message. - //In the ipc_mapt_data_t structure, opt95_dBuf and mapt are union members. Copy to a temporary variable before parsing. - unsigned char temp_opt95_dBuf[BUFLEN_256] = {0}; - memcpy(temp_opt95_dBuf, pNewIpcMsg->opt95_dBuf, sizeof(temp_opt95_dBuf)); - WanMgr_MaptParseOpt95Response(pNewIpcMsg->sitePrefix, temp_opt95_dBuf, pNewIpcMsg); -#endif //get MAP-T previous data memcpy(&dhcp6cMAPTMsgBodyPrvs, &(pVirtIf->MAP.dhcp6cMAPTparameters), sizeof(ipc_mapt_data_t)); From 99488a3e61494cecad5bf2474c52c99f636451e6 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Thu, 24 Oct 2024 12:59:46 +0000 Subject: [PATCH 35/64] Removing unnecessory APIs Signed-off-by: S-Parthiban-Selvaraj --- .../DHCPv6cMsgHandler/dhcpv6c_msg_apis.c | 355 ++---------------- 1 file changed, 25 insertions(+), 330 deletions(-) diff --git a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c index 1118c55f..74e220e2 100644 --- a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c @@ -81,7 +81,7 @@ * Static function prototypes */ //PARTHIBAN : disable_mapt_accel -static RETURN_STATUS CosaDmlMaptPrintConfig (VOID); +//static RETURN_STATUS CosaDmlMaptPrintConfig (VOID); //static RETURN_STATUS CosaDmlMaptResetConfig (VOID); //static RETURN_STATUS CosaDmlMaptResetClient (VOID); //static RETURN_STATUS CosaDmlMaptResetEvents (VOID); @@ -89,20 +89,20 @@ static RETURN_STATUS CosaDmlMaptPrintConfig (VOID); //static RETURN_STATUS CosaDmlMaptDisplayFeatureStatus (VOID); //PARTHIBAN : check other features //static RETURN_STATUS CosaDmlMaptFlushDNSv4Entries (VOID); //static RETURN_STATUS CosaDmlMaptRollback (RB_STATE eState); //PARTHIBAN : Check IGD -static RETURN_STATUS CosaDmlMaptParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); -static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); -static RETURN_STATUS CosaDmlMaptFormulateIPv4Address (UINT32 ipv4Suffix, PCHAR pIPv4AddrString); -static RETURN_STATUS CosaDmlMaptConvertStringToHexStream (PUCHAR pOptionBuf, - PUINT16 uiOptionBufLen); -static RETURN_STATUS CosaDmlMaptFormulateIPv6Address (PCHAR pPdIPv6Prefix, PCHAR pIPv4AddrSting, +//static RETURN_STATUS CosaDmlMaptFormulateIPv4Address (UINT32 ipv4Suffix, PCHAR pIPv4AddrString); +//static RETURN_STATUS CosaDmlMaptFormulateIPv6Address (PCHAR pPdIPv6Prefix, PCHAR pIPv4AddrSting, UINT16 psid, PCHAR pIPv6AddrString); -static RETURN_STATUS CosaDmlMaptComputePsidAndIPv4Suffix (PCHAR pPdIPv6Prefix, - UINT16 ui16PdPrefixLen, UINT16 ui16v6PrefixLen, UINT16 ui16v4PrefixLen, - PUINT16 pPsid, PUINT16 pPsidLen, PUINT32 pIPv4Suffix); +//static RETURN_STATUS CosaDmlMaptComputePsidAndIPv4Suffix (PCHAR pPdIPv6Prefix, + // UINT16 ui16PdPrefixLen, UINT16 ui16v6PrefixLen, UINT16 ui16v4PrefixLen, + // PUINT16 pPsid, PUINT16 pPsidLen, PUINT32 pIPv4Suffix); //PARTHIBAN : Check IGD and Ipv4 DNS static PVOID CosaDmlMaptSetUPnPIGDService (PVOID arg); +static RETURN_STATUS CosaDmlMaptParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); +static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); +static RETURN_STATUS CosaDmlMaptConvertStringToHexStream (PUCHAR pOptionBuf, + PUINT16 uiOptionBufLen); /* * Global definitions */ @@ -127,91 +127,6 @@ CosaDmlMaptCalculateChecksum(unsigned char *buf) return checksum; } -static RETURN_STATUS -CosaDmlMaptFormulateIPv4Address -( - UINT32 ipv4Suffix, - PCHAR pIPv4AddrString -) -{ - UCHAR ipv4AddrBytes[BUFLEN_4]; - struct in_addr ipv4Addr; - UINT32 ipv4Hex = 0; - int rc = -1; - - MAPT_LOG_INFO("Entry"); - - if ( inet_pton(AF_INET, g_stMaptData.RuleIPv4Prefix, &ipv4Addr) <= 0 ) - { - MAPT_LOG_ERROR("Invalid IPv4 address = %s", g_stMaptData.RuleIPv4Prefix); - return STATUS_FAILURE; - } - - ipv4Hex = htonl(ipv4Addr.s_addr); - - *(PUINT32)ipv4AddrBytes = FIRST_BYTE((FIRST_BYTE(ipv4Hex) + FIRST_BYTE(ipv4Suffix))) - | SECND_BYTE((SECND_BYTE(ipv4Hex) + SECND_BYTE(ipv4Suffix))) - | THIRD_BYTE((THIRD_BYTE(ipv4Hex) + THIRD_BYTE(ipv4Suffix))) - | FORTH_BYTE((FORTH_BYTE(ipv4Hex) + FORTH_BYTE(ipv4Suffix))); - - rc = snprintf (pIPv4AddrString, BUFLEN_16, "%d.%d.%d.%d", - ipv4AddrBytes[3], ipv4AddrBytes[2], ipv4AddrBytes[1], ipv4AddrBytes[0]); - ERR_CHK(rc); - - return STATUS_SUCCESS; -} - - -static RETURN_STATUS -CosaDmlMaptFormulateIPv6Address -( - PCHAR pPdIPv6Prefix, - PCHAR pIPv4AddrSting, - UINT16 psid, - PCHAR pIPv6AddrString -) -{ - UCHAR ipv4AddrBytes[BUFLEN_4]; - struct in6_addr ipv6Addr; - struct in_addr ipv4Addr; - UINT32 ipv4Hex = 0; - int rc = -1; - - MAPT_LOG_INFO("Entry"); - - if ( inet_pton(AF_INET, pIPv4AddrSting, &ipv4Addr) <= 0) - { - MAPT_LOG_ERROR("Invalid IPv4 address = %s", pIPv4AddrSting); - return STATUS_FAILURE; - } - - ipv4Hex = htonl(ipv4Addr.s_addr); - - *(PUINT32)ipv4AddrBytes = FIRST_BYTE(ipv4Hex) - | SECND_BYTE(ipv4Hex) - | THIRD_BYTE(ipv4Hex) - | FORTH_BYTE(ipv4Hex); - - if ( inet_pton(AF_INET6, pPdIPv6Prefix, &ipv6Addr) <= 0) - { - MAPT_LOG_ERROR("Invalid IPv6 address = %s", pPdIPv6Prefix); - return STATUS_FAILURE; - } - - rc = snprintf (pIPv6AddrString, BUFLEN_40, - "%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x", - ipv6Addr.s6_addr[0], ipv6Addr.s6_addr[1], ipv6Addr.s6_addr[2], ipv6Addr.s6_addr[3], - ipv6Addr.s6_addr[4], ipv6Addr.s6_addr[5], ipv6Addr.s6_addr[6], ipv6Addr.s6_addr[7], - 0x0, 0x0, ipv4AddrBytes[3], ipv4AddrBytes[2], ipv4AddrBytes[1], ipv4AddrBytes[0], - SECND_BYTE(psid)>>8, FIRST_BYTE(psid)); - ERR_CHK(rc); - - MAPT_LOG_INFO("IPv6AddrString is : %s", pIPv6AddrString); - - return STATUS_SUCCESS; -} - - static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex ( @@ -318,135 +233,6 @@ CosaDmlMaptSetUPnPIGDService return STATUS_NULL; } -/* - : : ___/ : - | p bits | / q bits : - +-----------+ +------------+ - |IPv4 suffix| |Port Set ID | - +-----------+ +------------+ - \ / ____/ ________/ - \ : __/ _____/ - \ : / / - | n bits | o bits | s bits | 128-n-o-s bits | - +--------------------+-----------+---------+------------+----------+ - | Rule IPv6 prefix | EA bits |subnet ID| interface ID | - +--------------------+-----------+---------+-----------------------+ - |<--- End-user IPv6 prefix --->| - -EA-bits: -+-------------------+---------+ -|IPV4 Address Suffix| PSID | -+-------------------+---------+ -|--------p----------|----q----+ -|--------------o--------------| -*/ - -static RETURN_STATUS -CosaDmlMaptComputePsidAndIPv4Suffix -( - PCHAR pPdIPv6Prefix, - UINT16 ui16PdPrefixLen, - UINT16 ui16v6PrefixLen, - UINT16 ui16v4PrefixLen, - PUINT16 pPsid, - PUINT16 pPsidLen, - PUINT32 pIPv4Suffix -) -{ - UINT8 ui8v4BitIdxLen = 0, ui8PsidBitIdxLen = 0, ui8EaStartByteSetBits = 0; - UINT8 ui8EaLen = 0, ui8EaStartByte = 0, ui8EaLastByte = 0; - ULONG ulEaBytes = 0; - struct in6_addr ipv6Addr; - - MAPT_LOG_INFO("Entry"); - - // V4 suffix bits length - ui8v4BitIdxLen = BUFLEN_32 - ui16v4PrefixLen; - - // EA bits length - ui8EaLen = ui16PdPrefixLen - ui16v6PrefixLen; - - // PSID length - ui8PsidBitIdxLen = ui8EaLen - ui8v4BitIdxLen; - - MAPT_LOG_INFO("<<>> ui8v4BitIdxLen(IPV4 Suffix Bits): %u", ui8v4BitIdxLen); - MAPT_LOG_INFO("<<>> ui8EaLen (EA bits) : %u", ui8EaLen); - MAPT_LOG_INFO("<<>> ui8PsidBitIdxLen(PSID length) : %u", ui8PsidBitIdxLen); - - if (ui8EaLen != g_stMaptData.EaLen) - { - MAPT_LOG_INFO("Calculated EA-bits and received MAP EA-bits does not match!"); - return STATUS_FAILURE; - } - - if ( ui16PdPrefixLen < ui16v6PrefixLen ) - { - MAPT_LOG_ERROR("Invalid MAPT option, ui16PdPrefixLen(%d) < ui16v6PrefixLen(%d)", - ui16PdPrefixLen, ui16v6PrefixLen); - return STATUS_FAILURE; - } - - if ( inet_pton(AF_INET6, pPdIPv6Prefix, &ipv6Addr) <= 0 ) - { - MAPT_LOG_ERROR("Invalid IPv6 address = %s", pPdIPv6Prefix); - return STATUS_FAILURE; - } - - if ( ui8EaLen ) - { - UINT8 idx = 0; - ui8EaStartByte = ui16v6PrefixLen / 8; - ui8EaLastByte = ui8EaStartByte + ui8EaLen/8 + ((ui8EaLen % 8)?1:0); - ui8EaStartByteSetBits = ui16v6PrefixLen % 8; - - MAPT_LOG_INFO("<<>> ui8EaStartByte : %u", ui8EaStartByte); - MAPT_LOG_INFO("<<>> ui8EaLastByte : %u", ui8EaLastByte); - MAPT_LOG_INFO("<<>> ui8EaStartByteSetBits : %u", ui8EaStartByteSetBits); - - /* Extracting ui8EaLen/8 bytes of EA bits from Pd IPv6 prefix */ - do - { - ulEaBytes = ulEaBytes << 8 | ipv6Addr.s6_addr[ui8EaStartByte + idx]; - } while (idx++, (idx < (ui8EaLastByte - ui8EaStartByte))); - - MAPT_LOG_INFO("<<>> No.of bytes extracted: %d, ulEaBytes: 0x%lX", idx, ulEaBytes); - - // If prefix is not aa multiple of 8, get the extra byte and extract the bits - if ( ui8EaStartByteSetBits ) - { - MAPT_LOG_INFO("MAP V6 Prefix not in multiples of 8, Prefix = %d", ui16v6PrefixLen); - ulEaBytes <<= 8; - ulEaBytes |= (ipv6Addr.s6_addr[ui8EaLastByte]); - - // push the extra bits out from the last byte - ulEaBytes >>= (((ui8EaLastByte - ui8EaStartByte) * 8 - ui8EaLen) + (8-ui8EaStartByteSetBits)); - - // clear the extra bits from the first EA byte - ulEaBytes = (ulEaBytes & SET_RSHIFT_MASK(ui8EaLen)); - - MAPT_LOG_INFO("<<>> ulEaBytes: 0x%lX", ulEaBytes); - } - else - { - // push the extra bits out from the last byte - ulEaBytes = (ulEaBytes >> (((ui8EaLastByte-ui8EaStartByte)*8) - ui8EaLen)); - MAPT_LOG_INFO("<<>> ulEaBytes: 0x%lX\n", ulEaBytes); - } - - // p-bits - *pIPv4Suffix = (ulEaBytes >> ui8PsidBitIdxLen) & SET_RSHIFT_MASK(ui8v4BitIdxLen); - - // q-bits - *pPsid = (ulEaBytes & (SET_RSHIFT_MASK(ui8PsidBitIdxLen))); - *pPsidLen = ui8PsidBitIdxLen; - } - - MAPT_LOG_INFO("IPv4Suffix: %u | Psid: %u | Psidlen: %u",*pIPv4Suffix, *pPsid, *pPsidLen); - - return STATUS_SUCCESS; -} - - static RETURN_STATUS CosaDmlMaptParseResponse ( @@ -649,71 +435,6 @@ MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6Prefix : %s", g_stMaptData.BrIP } -static RETURN_STATUS -CosaDmlMaptPrintConfig -( - VOID -) -{ - CHAR ruleIPv4Prefix[BUFLEN_40] = "\0"; - CHAR ruleIPv6Prefix[BUFLEN_40] = "\0"; - CHAR pdIPv6Prefix[BUFLEN_40] = "\0"; - CHAR brIPv6Prefix[BUFLEN_40] = "\0"; - int rc = -1; - - rc = snprintf (ruleIPv4Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv4Prefix - , g_stMaptData.RuleIPv4PrefixLen); - ERR_CHK(rc); - rc = snprintf (ruleIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.RuleIPv6Prefix - , g_stMaptData.RuleIPv6PrefixLen); - ERR_CHK(rc); - rc = snprintf (pdIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.PdIPv6Prefix - , g_stMaptData.PdIPv6PrefixLen); - ERR_CHK(rc); - rc = snprintf (brIPv6Prefix, BUFLEN_40, "%s/%u", g_stMaptData.BrIPv6Prefix - , g_stMaptData.BrIPv6PrefixLen); - ERR_CHK(rc); - - MAPT_LOG_INFO("\r" - "+-------------------------------------------------------------+\n" - "| MAP-T Configuration |\n" - "+-------------------+-----------------------------------------+",""); - MAPT_LOG_INFO("\r" - "| fmr | %-40s" "|%15s\n" - "| ealen | %-40u" "|\n" - "| psid | %-40u" "|" - , g_stMaptData.bFMR?"true":"false", "" - , g_stMaptData.EaLen - , g_stMaptData.Psid); - MAPT_LOG_INFO("\r" - "| psidlen | %-40u" "|\n" - "| psid offset | %-40u" "|\n" - "| ratio | %-40u" "|" - , g_stMaptData.PsidLen, "" - , g_stMaptData.PsidOffset - , g_stMaptData.Ratio); - MAPT_LOG_INFO("\r" - "| rule ipv4 prefix | %-40s" "|\n" - "| rule ipv6 prefix | %-40s" "|\n" - "| ipv6 prefix | %-40s" "|" - , ruleIPv4Prefix, "" - , ruleIPv6Prefix - , pdIPv6Prefix); - MAPT_LOG_INFO("\r" - "| br ipv6 prefix | %-40s" "|\n" - "| ipv4 suffix | %-40u" "|\n" - "| map ipv4 address | %-40s" "|" - , brIPv6Prefix, "" - , g_stMaptData.IPv4Suffix - , g_stMaptData.IPv4AddrString); - MAPT_LOG_INFO("\r" - "| map ipv6 address | %-40s" "|\n" - "+-------------------+-----------------------------------------+\n" - , g_stMaptData.IPv6AddrString, ""); - - return STATUS_SUCCESS; -} - static RETURN_STATUS CosaDmlMaptConvertStringToHexStream ( @@ -809,37 +530,6 @@ ANSC_STATUS WanMgr_MaptParseOpt95Response ret = STATUS_FAILURE; } - /* Derive IPv4 suffix and PSID value */ - if ( !ret && CosaDmlMaptComputePsidAndIPv4Suffix ( g_stMaptData.PdIPv6Prefix - , g_stMaptData.PdIPv6PrefixLen - , g_stMaptData.RuleIPv6PrefixLen - , g_stMaptData.RuleIPv4PrefixLen - , &g_stMaptData.IPv4Psid - , &g_stMaptData.IPv4PsidLen - , &g_stMaptData.IPv4Suffix) != STATUS_SUCCESS ) - { - MAPT_LOG_ERROR("MAPT Psid and IPv4 Suffix Computaion Failed !!"); - ret = STATUS_FAILURE; - } - - /* Calculate CE IPv4 Address */ - if ( !ret && CosaDmlMaptFormulateIPv4Address ( g_stMaptData.IPv4Suffix - , g_stMaptData.IPv4AddrString) != STATUS_SUCCESS) - { - MAPT_LOG_ERROR("MAPT Ipv4 Configuration Failed !!"); - ret = STATUS_FAILURE; - } - - /* Calculate CE IPv6 Address */ - if ( !ret && CosaDmlMaptFormulateIPv6Address ( g_stMaptData.PdIPv6Prefix - , g_stMaptData.IPv4AddrString - , g_stMaptData.Psid - , g_stMaptData.IPv6AddrString) != STATUS_SUCCESS) - { - MAPT_LOG_ERROR("MAPT Ipv6 Configuration Failed !!"); - ret = STATUS_FAILURE; - } - if( ret == STATUS_SUCCESS ) { //Fill Required MAP-T information @@ -865,8 +555,6 @@ ANSC_STATUS WanMgr_MaptParseOpt95Response , g_stMaptData.BrIPv6PrefixLen); ERR_CHK(rc); - CosaDmlMaptPrintConfig(); - MAPT_LOG_INFO("MAPT configuration complete.\n"); } @@ -1005,7 +693,6 @@ static void * WanMgr_DhcpV6MsgHandler() int dataLen = sscanf(p, "%63s %63s %63s %31s %31s %31s %31s %31s %63s %11s %31s %31s %31s %31s %31s", action, IfaceName, v6addr, iana_iaid, iana_t1, iana_t2, iana_pretm, iana_vldtm, v6pref, preflen, iapd_iaid, iapd_t1, iapd_t2, iapd_pretm, iapd_vldtm); - CcspTraceDebug(("%s,%d: dataLen = %d\n", __FUNCTION__, __LINE__, dataLen)); if (dataLen == 15) #endif { @@ -1116,8 +803,9 @@ static void * WanMgr_DhcpV6MsgHandler() pVirtIf->IP.pIpcIpv6Data = (ipc_dhcpv6_data_t*) malloc(sizeof(ipc_dhcpv6_data_t)); if(pVirtIf->IP.pIpcIpv6Data != NULL) { - // copy data + // copy data memcpy(pVirtIf->IP.pIpcIpv6Data, &dhcpv6_data, sizeof(ipc_dhcpv6_data_t)); + CcspTraceInfo(("%s %d IPv6 lease info add to Interface ID(%d), Virtual interface Name : %s , Alias %s \n", __FUNCTION__, __LINE__, pVirtIf->baseIfIdx+1, pVirtIf->Name, pVirtIf->Alias)); } } //release lock @@ -1146,16 +834,23 @@ ANSC_STATUS WanMgr_DhcpV6MsgHandlerInit() //create thread pthread_t ipv6LeaseParser; - ret = pthread_create( &ipv6LeaseParser, NULL, &WanMgr_DhcpV6MsgHandler, NULL ); - - if( 0 != ret ) + if ( ( !mkfifo(CCSP_COMMON_FIFO, 0666) || errno == EEXIST ) ) { - CcspTraceInfo(("%s %d - Failed to start WanMgr_DhcpV6MsgHandler Thread Error:%d\n", __FUNCTION__, __LINE__, ret)); + ret = pthread_create( &ipv6LeaseParser, NULL, &WanMgr_DhcpV6MsgHandler, NULL ); + + if( 0 != ret ) + { + CcspTraceError(("%s %d - Failed to start WanMgr_DhcpV6MsgHandler Thread Error:%d\n", __FUNCTION__, __LINE__, ret)); + } + else + { + CcspTraceInfo(("%s %d - WanMgr_DhcpV6MsgHandler Thread Started Successfully\n", __FUNCTION__, __LINE__)); + retStatus = ANSC_STATUS_SUCCESS; + } } else { - CcspTraceInfo(("%s %d - WanMgr_DhcpV6MsgHandler Thread Started Successfully\n", __FUNCTION__, __LINE__)); - retStatus = ANSC_STATUS_SUCCESS; + CcspTraceError(("%s %d - Failed to create %s \n", __FUNCTION__, __LINE__, CCSP_COMMON_FIFO)); } return retStatus ; } From df36c4a98835d8f1627da4c8fc512c339794897b Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Thu, 24 Oct 2024 16:30:00 +0000 Subject: [PATCH 36/64] Adding Comcast workaround for IPv4 DNS in Ethernet Wan Enabling and Disabling UPNP IGP while configuring MAPT Kernel Configuration for Broadcom platforms /proc/sys/net/flowmgr/disable_mapt_accel Signed-off-by: S-Parthiban-Selvaraj --- .../DHCPv6cMsgHandler/dhcpv6c_msg_apis.c | 187 ++++-------------- .../DHCPv6cMsgHandler/dhcpv6c_msg_apis.h | 47 ----- source/WanManager/wanmgr_interface_sm.c | 29 ++- source/WanManager/wanmgr_net_utils.c | 45 +++++ 4 files changed, 106 insertions(+), 202 deletions(-) diff --git a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c index 74e220e2..172d1b4d 100644 --- a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c @@ -55,78 +55,34 @@ #include "wanmgr_dml.h" #include "dhcpv6c_msg_apis.h" + /* * Macro definitions */ -#define STATUS_NULL NULL -#define FIRST_BYTE(byte) (byte & 0xFF) -#define SECND_BYTE(byte) (byte & 0xFF00) -#define THIRD_BYTE(byte) (byte & 0xFF0000) -#define FORTH_BYTE(byte) (byte & 0xFF000000) - - -#define SET_BIT_MASK(maskBits, shiftBits) ( \ - (ULONGLONG)(0xFFFFFFFFFFFFFFFF << (64-maskBits)) \ - >> (64-maskBits-shiftBits) \ - ) - -#define SET_RSHIFT_MASK(maskBits) ((ULONGLONG)(0xFFFFFFFFFFFFFFFF >> (64-maskBits))) #define STRING_TO_HEX(pStr) ( (pStr-'a'<0)? (pStr-'A'<0)? pStr-'0' : pStr-'A'+10 : pStr-'a'+10 ) #define ERR_CHK(x) #define CCSP_COMMON_FIFO "/tmp/ccsp_common_fifo" +extern int sysevent_fd; +extern token_t sysevent_token; + /* * Static function prototypes */ -//PARTHIBAN : disable_mapt_accel -//static RETURN_STATUS CosaDmlMaptPrintConfig (VOID); -//static RETURN_STATUS CosaDmlMaptResetConfig (VOID); -//static RETURN_STATUS CosaDmlMaptResetClient (VOID); -//static RETURN_STATUS CosaDmlMaptResetEvents (VOID); -//static RETURN_STATUS CosaDmlMaptStopServices (VOID); -//static RETURN_STATUS CosaDmlMaptDisplayFeatureStatus (VOID); //PARTHIBAN : check other features -//static RETURN_STATUS CosaDmlMaptFlushDNSv4Entries (VOID); -//static RETURN_STATUS CosaDmlMaptRollback (RB_STATE eState); //PARTHIBAN : Check IGD -//static RETURN_STATUS CosaDmlMaptFormulateIPv4Address (UINT32 ipv4Suffix, PCHAR pIPv4AddrString); -//static RETURN_STATUS CosaDmlMaptFormulateIPv6Address (PCHAR pPdIPv6Prefix, PCHAR pIPv4AddrSting, - UINT16 psid, PCHAR pIPv6AddrString); -//static RETURN_STATUS CosaDmlMaptComputePsidAndIPv4Suffix (PCHAR pPdIPv6Prefix, - // UINT16 ui16PdPrefixLen, UINT16 ui16v6PrefixLen, UINT16 ui16v4PrefixLen, - // PUINT16 pPsid, PUINT16 pPsidLen, PUINT32 pIPv4Suffix); - -//PARTHIBAN : Check IGD and Ipv4 DNS -static PVOID CosaDmlMaptSetUPnPIGDService (PVOID arg); - +#if defined (MAPT_UNIFICATION_ENABLED) static RETURN_STATUS CosaDmlMaptParseResponse (PUCHAR pOptionBuf, UINT16 uiOptionBufLen); static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex (PUCHAR pIPv6AddrH, PCHAR pIPv6AddrS); -static RETURN_STATUS CosaDmlMaptConvertStringToHexStream (PUCHAR pOptionBuf, - PUINT16 uiOptionBufLen); +static RETURN_STATUS CosaDmlMaptConvertStringToHexStream (PUCHAR pOptionBuf, PUINT16 uiOptionBufLen); /* * Global definitions */ static COSA_DML_MAPT_DATA g_stMaptData; -static volatile UINT8 g_bEnableUPnPIGD; -extern ANSC_HANDLE bus_handle; -extern int sysevent_fd; -extern token_t sysevent_token; /* * Static function definitions */ -static UINT -CosaDmlMaptCalculateChecksum(unsigned char *buf) -{ - unsigned int checksum = 0; - - while (*buf) { - checksum += *buf; - buf++; - } - return checksum; -} - static RETURN_STATUS CosaDmlMaptGetIPv6StringFromHex ( @@ -156,83 +112,6 @@ CosaDmlMaptGetIPv6StringFromHex return STATUS_SUCCESS; } -static PVOID -CosaDmlMaptSetUPnPIGDService -( - PVOID arg -) -{ - INT size = 0; - INT ret = CCSP_FAILURE; - extern CHAR g_Subsystem[BUFLEN_32]; - CHAR dst_pathname_cr[BUFLEN_64] = {0}; - int safec_ret = -1; - PCHAR faultParam = NULL; - componentStruct_t** ppComponents = NULL; - parameterValStruct_t value = {"Device.UPnP.Device.UPnPIGD", - (PCHAR)arg, - ccsp_boolean}; - - CCSP_MESSAGE_BUS_INFO *bus_info = (CCSP_MESSAGE_BUS_INFO *)bus_handle; - - pthread_detach(pthread_self()); - - safec_ret = snprintf(dst_pathname_cr, sizeof(dst_pathname_cr), "%s%s", g_Subsystem, CCSP_DBUS_INTERFACE_CR); - ERR_CHK(safec_ret); - - ret = CcspBaseIf_discComponentSupportingNamespace(bus_handle - , dst_pathname_cr - , value.parameterName - , g_Subsystem - , &ppComponents - , &size); - - if ( ret != CCSP_SUCCESS || size != 1 ) { - MAPT_LOG_ERROR("Error: '%s' does not exist|size:%d", value.parameterName, size); - return STATUS_NULL; - } - - ret = CcspBaseIf_setParameterValues(bus_handle - , ppComponents[0]->componentName - , ppComponents[0]->dbusPath - , 0 - , 0 - , (PVOID)&value - , 1 - , TRUE - , &faultParam); - - if ( CCSP_SUCCESS != ret ) - { - MAPT_LOG_ERROR("CcspBaseIf set param failed! ret %d", ret); - if ( faultParam ) - { - bus_info->freefunc(faultParam); - } - return STATUS_NULL; - } - free_componentStruct_t(bus_handle, 1, ppComponents); - - { - INT cResult = -1; - - safec_ret = strcmp_s((PCHAR)arg, strlen((PCHAR)arg), "true", &cResult); - ERR_CHK(safec_ret); - - if ( !safec_ret && !cResult ) - { - g_bEnableUPnPIGD = 0; - MAPT_LOG_INFO("### Mapt UPnP_IGD service reset."); - } - else - { - g_bEnableUPnPIGD = 1; - } - } - - return STATUS_NULL; -} - static RETURN_STATUS CosaDmlMaptParseResponse ( @@ -267,8 +146,8 @@ MAPT_LOG_INFO("<<>> Start : %p | End : %p", pStartBuf,pEndBuf); pCurOption = (PUCHAR)(pStartBuf + 1); pNxtOption = (PCOSA_DML_MAPT_OPTION)(pCurOption + uiOptionLen); -MAPT_LOG_INFO("<<>> Cur : %p | Nxt : %p", pCurOption,pNxtOption); -MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); + MAPT_LOG_INFO("<<>> Cur : %p | Nxt : %p", pCurOption,pNxtOption); + MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); /* option length field overrun */ if ( pNxtOption > pEndBuf ) @@ -316,13 +195,13 @@ MAPT_LOG_INFO("<<>> Opt : %u | OpLen : %u", uiOption,uiOptionLen); (v6ByteLen+(v6BitLen?1:0))*sizeof(CHAR)); ERR_CHK(rc); CosaDmlMaptGetIPv6StringFromHex (g_stMaptData.RuleIPv6PrefixH, - g_stMaptData.RuleIPv6Prefix); -MAPT_LOG_INFO("<<>> g_stMaptData.bFMR : %d", g_stMaptData.bFMR); -MAPT_LOG_INFO("<<>> g_stMaptData.EaLen : %u", g_stMaptData.EaLen); -MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4PrefixLen : %u", g_stMaptData.RuleIPv4PrefixLen); -MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4Prefix : %s", g_stMaptData.RuleIPv4Prefix); -MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6PrefixLen : %u", g_stMaptData.RuleIPv6PrefixLen); -MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6Prefix : %s", g_stMaptData.RuleIPv6Prefix); + g_stMaptData.RuleIPv6Prefix); + MAPT_LOG_INFO("<<>> g_stMaptData.bFMR : %d", g_stMaptData.bFMR); + MAPT_LOG_INFO("<<>> g_stMaptData.EaLen : %u", g_stMaptData.EaLen); + MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4PrefixLen : %u", g_stMaptData.RuleIPv4PrefixLen); + MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv4Prefix : %s", g_stMaptData.RuleIPv4Prefix); + MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6PrefixLen : %u", g_stMaptData.RuleIPv6PrefixLen); + MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6Prefix : %s", g_stMaptData.RuleIPv6Prefix); MAPT_LOG_INFO("Parsing OPTION_S46_RULE Successful."); /* @@ -337,8 +216,8 @@ MAPT_LOG_INFO("<<>> g_stMaptData.RuleIPv6Prefix : %s", g_stMaptData.Ru (BUFLEN_32 - g_stMaptData.RuleIPv4PrefixLen)); /* RFC default */ g_stMaptData.PsidOffset = 6; -MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); -MAPT_LOG_INFO("<<>> bytesLeftOut : %u", bytesLeftOut); + MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); + MAPT_LOG_INFO("<<>> bytesLeftOut : %u", bytesLeftOut); if ( bytesLeftOut > 0 ) { /* this rule option includes port param option */ @@ -368,11 +247,11 @@ MAPT_LOG_INFO("<<>> bytesLeftOut : %u", bytesLeftOut); * bits on the right are padding zeros. */ g_stMaptData.Psid = ntohs(*((PUINT16)++pCurOption)) >> - (16 - g_stMaptData.PsidLen); -MAPT_LOG_INFO("<<>> g_stMaptData.Psid : %u", g_stMaptData.Psid); -MAPT_LOG_INFO("<<>> g_stMaptData.PsidLen : %u", g_stMaptData.PsidLen); -MAPT_LOG_INFO("<<>> g_stMaptData.PsidOffset : %u", g_stMaptData.PsidOffset); -MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); + (16 - g_stMaptData.PsidLen); + MAPT_LOG_INFO("<<>> g_stMaptData.Psid : %u", g_stMaptData.Psid); + MAPT_LOG_INFO("<<>> g_stMaptData.PsidLen : %u", g_stMaptData.PsidLen); + MAPT_LOG_INFO("<<>> g_stMaptData.PsidOffset : %u", g_stMaptData.PsidOffset); + MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); MAPT_LOG_INFO("Parsing OPTION_S46_PORT_PARAM Successful."); } else @@ -410,8 +289,8 @@ MAPT_LOG_INFO("<<>> g_stMaptData.Ratio : %u", g_stMaptData.Ratio); ERR_CHK(rc); CosaDmlMaptGetIPv6StringFromHex (ipv6Addr, g_stMaptData.BrIPv6Prefix); -MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6PrefixLen : %u", g_stMaptData.BrIPv6PrefixLen); -MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6Prefix : %s", g_stMaptData.BrIPv6Prefix); + MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6PrefixLen : %u", g_stMaptData.BrIPv6PrefixLen); + MAPT_LOG_INFO("<<>> g_stMaptData.BrIPv6Prefix : %s", g_stMaptData.BrIPv6Prefix); MAPT_LOG_INFO("Parsing OPTION_S46_DMR Successful."); break; } @@ -458,20 +337,20 @@ CosaDmlMaptConvertStringToHexStream pReadBf[strlen((PCHAR)pReadBf)-1] = '\0'; } -MAPT_LOG_INFO("<<>> pOptionBuf is %p : %s",pReadBf, pReadBf); + MAPT_LOG_INFO("<<>> pOptionBuf is %p : %s",pReadBf, pReadBf); while ( *pReadBf && *(pReadBf+1) ) { - if ( *pReadBf == ':' && pReadBf++ ) {} + if ( *pReadBf == ':' && pReadBf++ ) {} - *pWriteBf = (STRING_TO_HEX(*pReadBf) << 4) | STRING_TO_HEX(*(pReadBf+1)); + *pWriteBf = (STRING_TO_HEX(*pReadBf) << 4) | STRING_TO_HEX(*(pReadBf+1)); - ++pWriteBf; - ++pReadBf; - ++pReadBf; - ++*uiOptionBufLen; + ++pWriteBf; + ++pReadBf; + ++pReadBf; + ++*uiOptionBufLen; } *pWriteBf = '\0'; -MAPT_LOG_INFO("<<>> BufLen : %d", *uiOptionBufLen); + MAPT_LOG_INFO("<<>> BufLen : %d", *uiOptionBufLen); return STATUS_SUCCESS; } @@ -561,7 +440,7 @@ ANSC_STATUS WanMgr_MaptParseOpt95Response return ((ret) ? ANSC_STATUS_FAILURE : ANSC_STATUS_SUCCESS); } - +#endif // MAPT_UNIFICATION_ENABLED int remove_single_quote (char *buf) { diff --git a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h index 1a11a7d5..65286096 100644 --- a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.h @@ -39,9 +39,6 @@ #include "ipc_msg.h" -#define COSA_MAPT_SYSCFG_NAMESPACE "CosaMAPT" -#define COSA_MAPT_ID_SYSCFG_NAMESPACE COSA_MAPT_SYSCFG_NAMESPACE"IDs" - /* * DHCP MAPT options macro definitions */ @@ -51,29 +48,6 @@ #define MAPT_OPTION_S46_PORT_PARAMS 93 #define MAPT_OPTION_S46_CONT_MAPT 95 -/* - * MAPT events macro definitions - */ -#define EVENT_MAPT_TRANSPORT_MODE "map_transport_mode" -#define EVENT_MAPT_CONFIG_FLAG "mapt_config_flag" -#define EVENT_MAPT_EA_LENGTH "map_ea_length" -#define EVENT_MAPT_IS_FMR "map_is_fmr" -#define EVENT_MAPT_RATIO "mapt_ratio" -#define EVENT_MAPT_PSID_OFFSET "mapt_psid_offset" -#define EVENT_MAPT_PSID_VALUE "mapt_psid_value" -#define EVENT_MAPT_PSID_LENGTH "mapt_psid_length" -#define EVENT_MAPT_IPADDRESS "mapt_ip_address" -#define EVENT_MAPT_IPV6_ADDRESS "mapt_ipv6_address" -#define EVENT_MAPT_RULE_IPADDRESS "map_rule_ip_address" -#define EVENT_MAPT_RULE_IPV6_ADDRESS "map_rule_ipv6_address" -#define EVENT_MAPT_BR_IPV6_PREFIX "map_br_ipv6_prefix" -#define EVENT_FIREWALL_RESTART "firewall-restart" -#define EVENT_NTPD_RESTART "ntpd-restart" - -#define MAPT_INTERFACE "map0" -#define MAPT_MTU_SIZE "1500" -#define MAPT_V4_MTU_SIZE "1472" - #define BUFLEN_4 4 #define BUFLEN_8 8 #define BUFLEN_16 16 @@ -86,13 +60,6 @@ #define BUFLEN_512 512 #define BUFLEN_1024 1024 -#define SYSCFG_UPNP_IGD_ENABLED "upnp_igd_enabled" -#define SYSCFG_DMZ_ENABLED "dmz_enabled" -#define SYSCFG_PORT_FORWARDING_ENABLED "CosaNAT::port_forward_enabled" -#define SYSCFG_PORT_TRIGGERING_ENABLED "CosaNAT::port_trigger_enabled" -#define SYSCFG_MGMT_HTTPS_ENABLED "mgmt_wan_httpsaccess" -#define SYSCFG_MGMT_HTTP_ENABLED "mgmt_wan_httpaccess" - /* * Data type Macro definitions */ @@ -209,20 +176,6 @@ _RETURN_STATUS STATUS_FAILURE = -1 } RETURN_STATUS; - -typedef enum -_RB_STATE -{ - RB_NONE = 0x00, - RB_ALL = 0x1F, - RB_UPNPIGD = 0x10, - RB_EVENTS = 0x08, - RB_FIREWALL = 0x04, - RB_CONFIG = 0x02, - RB_DHCPCLIENT = 0x01 -} RB_STATE; - - typedef struct _COSA_DML_MAPT_DATA { diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index fd4e553c..f83f657b 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -218,6 +218,19 @@ static int wan_setUpMapt() { int ret = RETURN_OK; + //Configure mapt packet acceleration for supported platforms + if ( !access("/proc/sys/net/flowmgr/disable_mapt_accel", F_OK) ) + { + if (sysctl_iface_set("/proc/sys/net/flowmgr/disable_mapt_accel", NULL, "0") != 0) + { + CcspTraceError(("Failed to enable mapt packet acceleration!\n")); + } + } + else + { + CcspTraceWarning(("Mapt packet acceleration is not supported!\n")); + } + #if defined(IVI_KERNEL_SUPPORT) if (WanManager_DoSystemActionWithStatus("wanmanager", "insmod /lib/modules/`uname -r`/extra/ivi.ko") != RETURN_OK) { @@ -287,6 +300,19 @@ static int wan_tearDownMapt() } #endif //IVI_KERNEL_SUPPORT + //Configure mapt packet acceleration for supported platforms + if ( !access("/proc/sys/net/flowmgr/disable_mapt_accel", F_OK) ) + { + if (sysctl_iface_set("/proc/sys/net/flowmgr/disable_mapt_accel", NULL, "3") != 0) + { + CcspTraceError(("Failed to disable mapt packet acceleration!\n")); + } + } + else + { + CcspTraceWarning(("Mapt packet acceleration is not supported!\n")); + } + return ret; } #endif @@ -1221,7 +1247,8 @@ static int wan_tearDownIPv4(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) /** Reset IPv4 DNS configuration. */ #if (defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //TODO: XB devices use the DNS of primary for backup interfaces. Clear V4 DNS only if MAPT is up - if(p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) + /* FIXME: Issue in DNS ipv6 resolution when ethwan enabled *//* Workaround: We keep the ipv4 entries for name resolution */ + if(p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP && strstr(pInterface->BaseInterface, "Ethernet") == NULL) #endif if (RETURN_OK != wan_updateDNS(pWanIfaceCtrl, FALSE, (p_VirtIf->IP.Ipv6Status == WAN_IFACE_IPV6_STATE_UP))) { diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 9fa82b4f..8b68f7ac 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -754,6 +754,40 @@ static ANSC_STATUS WanManager_GetLANIPAddress(char *ipAddress, size_t length) return ANSC_STATUS_SUCCESS; } +#define UPnPIGD_ENABLE_DML "Device.UPnP.Device.UPnPIGD" +BOOL g_UPnPIGDServiceStopped = false; +int WanMgr_RdkBus_ConfigureUPnPIGDService (BOOL configure_UPnPIGD) +{ + if( configure_UPnPIGD && g_UPnPIGDServiceStopped) + { + CcspTraceInfo(("%s %d: upnp_igd was stopped while configuring MAPT. Starting the service again\n", __FUNCTION__, __LINE__)); + if (WanMgr_RdkBus_SetParamValues( PAM_COMPONENT_NAME, PAM_DBUS_PATH, UPnPIGD_ENABLE_DML, "true", ccsp_boolean, TRUE ) == ANSC_STATUS_SUCCESS) + { + CcspTraceInfo(("%s %d: Succesfully set %s to true\n", __FUNCTION__, __LINE__, UPnPIGD_ENABLE_DML)); + } + g_UPnPIGDServiceStopped = false; + } + else if(!configure_UPnPIGD) + { + char syscfg_enabled[BUFLEN_8] = {0}; + syscfg_get(NULL, "upnp_igd_enabled", syscfg_enabled, sizeof(syscfg_enabled)); + if('1' == syscfg_enabled[0]) + { + CcspTraceInfo(("%s %d: Stopping UPnPIGD service \n", __FUNCTION__, __LINE__)); + if (WanMgr_RdkBus_SetParamValues( PAM_COMPONENT_NAME, PAM_DBUS_PATH, UPnPIGD_ENABLE_DML, "false", ccsp_boolean, TRUE ) == ANSC_STATUS_SUCCESS) + { + CcspTraceInfo(("%s %d: Succesfully set %s to false\n", __FUNCTION__, __LINE__, UPnPIGD_ENABLE_DML)); + } + g_UPnPIGDServiceStopped = true; + } + else + { + CcspTraceInfo(("%s %d: UPnPIGD is not enabled in syscfg upnp_igd_enabled\n", __FUNCTION__, __LINE__)); + } + } + return 0; +} + ANSC_STATUS WanManager_VerifyMAPTConfiguration(ipc_mapt_data_t *dhcp6cMAPTMsgBody, WANMGR_MAPT_CONFIG_DATA *MaptConfig) { int ret = RETURN_OK; @@ -880,6 +914,13 @@ int WanManager_ProcessMAPTConfiguration(ipc_mapt_data_t *dhcp6cMAPTMsgBody, WANM } MaptInfo("mapt: MTU Size = %d \n", mtu_size_mapt); + /* Stopping UPnP, if mapt ratio is not 1:1 */ + if(dhcp6cMAPTMsgBody->ratio > 1) + { + CcspTraceInfo(("%s %d: MAPT ratio is %d. Stopping UPnP IGD \n", __FUNCTION__, __LINE__, dhcp6cMAPTMsgBody->ratio)); + WanMgr_RdkBus_ConfigureUPnPIGDService(false); + } + /* RM16042: Since erouter0 is vlan interface on top of eth3 ptm, we need to first set the MTU size of eth3 to 1520 and then change MTU of erouter0. Otherwise we can't configure MTU as we are getting `Numerical result out of range` error. @@ -1541,6 +1582,10 @@ int WanManager_ResetMAPTConfiguration(const char *baseIf, const char *vlanIf) * `mapt_configure_flag` and restart the firewall. */ //Reset MAP sysevent parameters maptInfo_reset(); + + /* Starting UPnP, if we have stopped it while configuring MAPT */ + WanMgr_RdkBus_ConfigureUPnPIGDService(true); + sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); CcspTraceNotice(("FEATURE_MAPT: MAP-T configuration cleared\n")); return RETURN_OK; From ceb1ca2038aea3fda0175e9391ae52f228e65ae9 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 25 Oct 2024 09:39:01 +0000 Subject: [PATCH 37/64] Fixing IP.Ipv6Changed in standby mode Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 4 ++++ source/WanManager/wanmgr_interface_sm.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index c156792c..926048ad 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -63,6 +63,7 @@ extern char g_Subsystem[32]; #endif #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) +#define COSA_DML_WANIface_ADDR_SYSEVENT_NAME "tr_%s_dhcpv6_client_v6addr" char PreviousIPv6Address[128] = {0}; //Global varibale to store previous IPv6 address #endif @@ -2042,6 +2043,9 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) { CcspTraceInfo(("assigned IPv6 address \n")); syscfg_set_string(SYSCFG_FIELD_IPV6_ADDRESS, pVirtIf->IP.Ipv6Data.address); + memset(cmdLine, 0, sizeof(cmdLine)); + snprintf(cmdLine, sizeof(cmdLine), COSA_DML_WANIface_ADDR_SYSEVENT_NAME ,pVirtIf->Name); + sysevent_set(sysevent_fd, sysevent_token, cmdLine, pVirtIf->IP.Ipv6Data.address, 0); } else /* IFADDRCONF_REMOVE */ { diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index f83f657b..4931b8a1 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -3251,7 +3251,7 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) { CcspTraceInfo((" %s %d - configure IPv6 prefix \n", __FUNCTION__, __LINE__)); } - p_VirtIf->IP.Ipv6Changed == FALSE; + p_VirtIf->IP.Ipv6Changed = FALSE; } if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) { From 9966ecf0a951d8996a004a597566133473a0244f Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Tue, 29 Oct 2024 11:19:08 +0000 Subject: [PATCH 38/64] Fixing PHY toggle sync issue in Autowan mode. Sometimes PHY status changes quickly leading VISM and selection policies going out of sync. Changed State_ScanningInterface to check VISM status instead of PHy status Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_policy_auto_impl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_policy_auto_impl.c b/source/WanManager/wanmgr_policy_auto_impl.c index ecf716ab..ddc0082d 100644 --- a/source/WanManager/wanmgr_policy_auto_impl.c +++ b/source/WanManager/wanmgr_policy_auto_impl.c @@ -1180,7 +1180,7 @@ static WcAwPolicyState_t State_ScanningInterface (WanMgr_Policy_Controller_t * p //If PHY is down ,rollback to waiting state after all VISM are terminated. - if(pActiveInterface->BaseInterfaceStatus != WAN_IFACE_PHY_STATUS_UP && WanMgr_Get_ISM_RunningStatus(pWanController->activeInterfaceIdx) == FALSE) + if(WanMgr_Get_ISM_RunningStatus(pWanController->activeInterfaceIdx) == FALSE) { CcspTraceInfo(("%s %d: selected interface index:%d is BaseInetrfaceStatus DOWN. \n", __FUNCTION__, __LINE__, pWanController->activeInterfaceIdx )); return Transition_ScanningInterfaceDown(pWanController); From 1f87a30a5d25f07a813d93c027cbf12e2f6a463a Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj <167313466+S-Parthiban-Selvaraj@users.noreply.github.com> Date: Fri, 8 Nov 2024 09:07:13 +0000 Subject: [PATCH 39/64] Fixing comments --- source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c | 2 +- source/WanManager/wanmgr_ipc.c | 2 +- source/WanManager/wanmgr_policy_auto_impl.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c b/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c index e0a3790f..0a9b95c2 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.c @@ -967,7 +967,7 @@ ANSC_STATUS WanMgr_RdkBus_setDhcpv6DnsServerInfo(void) #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) ANSC_STATUS WanMgr_RdkBus_setWanIpInterfaceData(DML_VIRTUAL_IFACE* pVirtIf) { - ANSC_STATUS retStatus = ANSC_STATUS_FAILURE; + ANSC_STATUS retStatus = ANSC_STATUS_SUCCESS; char dmQuery[BUFLEN_256] = {0}; snprintf(dmQuery, sizeof(dmQuery)-1, "%s.LowerLayers", pVirtIf->IP.Interface); if(pVirtIf->PPP.Enable == TRUE) diff --git a/source/WanManager/wanmgr_ipc.c b/source/WanManager/wanmgr_ipc.c index 058891dc..129961ad 100644 --- a/source/WanManager/wanmgr_ipc.c +++ b/source/WanManager/wanmgr_ipc.c @@ -487,7 +487,7 @@ ANSC_STATUS WanMgr_StartIpcServer() } #if defined(WAN_MANAGER_UNIFICATION_ENABLED) && !defined( RDKB_EXTENDER_ENABLED) - //TODO: XLE is still using the OLD dhcpv6c_dbg_thrd thread + //TODO: XLE is still using the legacy CcspPaM dhcpv6c_dbg_thrd thread WanMgr_DhcpV6MsgHandlerInit(); #endif diff --git a/source/WanManager/wanmgr_policy_auto_impl.c b/source/WanManager/wanmgr_policy_auto_impl.c index ddc0082d..35f0531b 100644 --- a/source/WanManager/wanmgr_policy_auto_impl.c +++ b/source/WanManager/wanmgr_policy_auto_impl.c @@ -1179,7 +1179,7 @@ static WcAwPolicyState_t State_ScanningInterface (WanMgr_Policy_Controller_t * p } - //If PHY is down ,rollback to waiting state after all VISM are terminated. + //Rollback to waiting state after all VISM are terminated. This could happen if PHY status changes when Interface is in scanning state. if(WanMgr_Get_ISM_RunningStatus(pWanController->activeInterfaceIdx) == FALSE) { CcspTraceInfo(("%s %d: selected interface index:%d is BaseInetrfaceStatus DOWN. \n", __FUNCTION__, __LINE__, pWanController->activeInterfaceIdx )); From b21093637aef6a35a72b9d38c76ec1a5a70cad3d Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Thu, 14 Nov 2024 14:27:02 +0000 Subject: [PATCH 40/64] Do not add prefix on LAN bridge for the Comcast platforms. Adding Product flag to control IPv6 assignmemnt on LAN bridge Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 926048ad..6115d513 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1890,12 +1890,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { if(pVirtIf->Status == WAN_IFACE_STATUS_UP && pNewIpcMsg->prefixPltime > 0 && pNewIpcMsg->prefixVltime > 0 ) //Update life time only if the interface is active. { +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not add prefix on LAN bridge for the Comcast platforms. //call function for changing the prlft and vallft if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) { CcspTraceError(("Life Time Setting Failed")); } sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); +#endif } pVirtIf->IP.Ipv6Renewed = TRUE; } @@ -2014,13 +2016,15 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) } else { +#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not add prefix on LAN bridge for the Comcast platforms. CcspTraceInfo(("%s Going to set [%s] address on brlan0 interface \n", __FUNCTION__, globalIP)); memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/64 dev %s valid_lft %d preferred_lft %d", globalIP, COSA_DML_DHCPV6_SERVER_IFNAME, pVirtIf->IP.Ipv6Data.prefixVltime, pVirtIf->IP.Ipv6Data.prefixPltime); if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); - +#endif + CcspTraceInfo(("%s lan_ipaddr_v6 set to [%s] \n", __FUNCTION__, globalIP)); /*This is for brlan0 interface */ char pref_len[10] ={0}; sscanf (pVirtIf->IP.Ipv6Data.sitePrefix,"%*[^/]/%s" ,pref_len); From 715f5ca3b622e74b330eb18069a2abd49fd4fe4e Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Fri, 15 Nov 2024 13:12:17 +0000 Subject: [PATCH 41/64] This is the change to create WAN ipv6 address from the delegated prefix if IANA is not assigned by the BNG Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 74 +++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 6115d513..53a197b7 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1484,7 +1484,7 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) CcspTraceError(("error, there is not '::' in prefix:%s\n", prefix)); return 1; } -#ifdef _HUB4_PRODUCT_REQ_ +#if 0//def _HUB4_PRODUCT_REQ_ if(strncmp(intfName, COSA_DML_DHCPV6_SERVER_IFNAME, strlen(intfName)) == 0) { snprintf(ipAddr, 128, "%s1", globalIP); @@ -1615,6 +1615,72 @@ static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* p } #endif +#define WAN_SUFFIX 1 +// Function to configure the WAN address +int configure_wan_address(struct in6_addr wan_addr, int prefix_length, WANMGR_IPV6_DATA *pIpv6DataNew ) +{ + + wan_addr.s6_addr[prefix_length / 8] |= 0x01; // Use :1 subnet for WAN + wan_addr.s6_addr[15] = WAN_SUFFIX; // Setting the last byte for WAN address + inet_ntop(AF_INET6, &wan_addr, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); + + CcspTraceInfo(("%s %d Calculated WAN network IP %s/128 \n", __FUNCTION__, __LINE__, pIpv6DataNew->address)); + //Since this address calculated by us, it will be assigned by the DHCPv6c client. Assign the address on the Wan interface + char cmdLine[256] = {0}; + snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/128 dev %s", pIpv6DataNew->address, pIpv6DataNew->ifname); + if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) + CcspTraceError(("failed to run cmd: %s", cmdLine)); + + return 0; +} + +// Function to configure the LAN address range +int configure_lan_address(struct in6_addr lan_addr, int prefix_length, WANMGR_IPV6_DATA *pIpv6DataNew) +{ + char ip_str[INET6_ADDRSTRLEN]; + // Use the next block for LAN (e.g., increment the relevant byte) + lan_addr.s6_addr[prefix_length / 8] |= 0x02; // Incrementing subnet for LAN + inet_ntop(AF_INET6, &lan_addr, ip_str, sizeof(ip_str)); + //Modify sitefrefix to avoiud overlapping with Wan IP + snprintf(pIpv6DataNew->sitePrefix, sizeof(pIpv6DataNew->sitePrefix), "%s/%d",ip_str,prefix_length); + + CcspTraceInfo(("%s %d Calculated LAN network prefix %s \n", __FUNCTION__, __LINE__, pIpv6DataNew->sitePrefix)); + return 0; +} + +int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) +{ + int prefix_length; + char iapd_prefix[128] = {0}; + sscanf (pIpv6DataNew->sitePrefix,"%s/%d" ,iapd_prefix, &prefix_length); + + if ( prefix_length >= 64) + { + CcspTraceError(("%s %d Prefix length is >= 64. Can't split to multiple /64 networks\n", __FUNCTION__, __LINE__)); + return -1; + } + + struct in6_addr prefix; + // Convert prefix to binary format + if (inet_pton(AF_INET6, iapd_prefix, &prefix) != 1) + { + fprintf(stderr, "Invalid IPv6 prefix\n"); + return -1; + } + + // Configure WAN and LAN addresses + if (configure_wan_address(prefix, prefix_length, pIpv6DataNew) != 0) + { + return -1; + } + if (configure_lan_address(prefix, prefix_length, pIpv6DataNew) != 0) + { + return -1; + } + + return 0; +} + ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { if(NULL == pVirtIf) @@ -1855,6 +1921,12 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) #endif } } + else + { + CcspTraceInfo(("IANA is not assigned by DHCPV6 and SLAAC. Using the IAPD for Wan Interface \n")); + wanmgr_Split_IAPD_for_WAN_LAN(&Ipv6DataNew); + } + } /* From 0abe743ceddf611faee3867b833f4bbafee4c152 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 15 Nov 2024 16:10:54 +0000 Subject: [PATCH 42/64] Fixing Prefix and length parsing Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 53a197b7..578d6aeb 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1652,7 +1652,11 @@ int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) { int prefix_length; char iapd_prefix[128] = {0}; - sscanf (pIpv6DataNew->sitePrefix,"%s/%d" ,iapd_prefix, &prefix_length); + + if (sscanf(pIpv6DataNew->sitePrefix, "%[^/]/%d", iapd_prefix, &prefix_length) != 2) + { + return -1; // Parsing failed + } if ( prefix_length >= 64) { @@ -1665,6 +1669,7 @@ int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) if (inet_pton(AF_INET6, iapd_prefix, &prefix) != 1) { fprintf(stderr, "Invalid IPv6 prefix\n"); + CcspTraceError(("%s %d Failed to convert prefix to in6_addr\n", __FUNCTION__, __LINE__)); return -1; } From f2294505a3945626aac0ac5c03baf9b7850a01bf Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Mon, 18 Nov 2024 10:35:25 +0000 Subject: [PATCH 43/64] RDKB-50962 : Fixing wanshow syscfg sets Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 578d6aeb..e121c73e 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1620,7 +1620,7 @@ static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* p int configure_wan_address(struct in6_addr wan_addr, int prefix_length, WANMGR_IPV6_DATA *pIpv6DataNew ) { - wan_addr.s6_addr[prefix_length / 8] |= 0x01; // Use :1 subnet for WAN + wan_addr.s6_addr[prefix_length / 8] += 0x01; // Use next subnet for WAN. First /64 2il be used for LAN. wan_addr.s6_addr[15] = WAN_SUFFIX; // Setting the last byte for WAN address inet_ntop(AF_INET6, &wan_addr, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); @@ -1634,6 +1634,7 @@ int configure_wan_address(struct in6_addr wan_addr, int prefix_length, WANMGR_IP return 0; } +/* // Function to configure the LAN address range int configure_lan_address(struct in6_addr lan_addr, int prefix_length, WANMGR_IPV6_DATA *pIpv6DataNew) { @@ -1647,6 +1648,7 @@ int configure_lan_address(struct in6_addr lan_addr, int prefix_length, WANMGR_IP CcspTraceInfo(("%s %d Calculated LAN network prefix %s \n", __FUNCTION__, __LINE__, pIpv6DataNew->sitePrefix)); return 0; } +*/ int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) { @@ -1678,10 +1680,10 @@ int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) { return -1; } - if (configure_lan_address(prefix, prefix_length, pIpv6DataNew) != 0) - { - return -1; - } +// if (configure_lan_address(prefix, prefix_length, pIpv6DataNew) != 0) + // { + // return -1; + // } return 0; } @@ -2093,6 +2095,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) } else { + snprintf(pVirtIf->IP.Ipv6Data.pdIfAddress, sizeof(pVirtIf->IP.Ipv6Data.pdIfAddress), "%s/64", globalIP); #if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not add prefix on LAN bridge for the Comcast platforms. CcspTraceInfo(("%s Going to set [%s] address on brlan0 interface \n", __FUNCTION__, globalIP)); memset(cmdLine, 0, sizeof(cmdLine)); @@ -2108,6 +2111,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_v6", pref_len, 0); sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_set", globalIP, 0); //TODO: This was a event to Wanmanager. if no other process listens to it. remove it. + sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_TR_BRLAN0_DHCPV6_SERVER_ADDRESS, globalIP, 0); } memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 route add %s dev %s", pVirtIf->IP.Ipv6Data.sitePrefix, COSA_DML_DHCPV6_SERVER_IFNAME); @@ -2135,6 +2139,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) } } + if (pVirtIf->IP.Ipv6Data.prefixAssigned && !IS_EMPTY_STRING(pVirtIf->IP.Ipv6Data.sitePrefix)) { if (pVirtIf->IP.Ipv6Data.prefixCmd == IFADDRCONF_ADD && @@ -2155,10 +2160,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) if (index < strlen(pVirtIf->IP.Ipv6Data.sitePrefix) && index < sizeof(prefix)) { strncpy(prefix, pVirtIf->IP.Ipv6Data.sitePrefix, index); // only copy prefix without the prefix length - snprintf(set_value, sizeof(set_value), "%s1", prefix); // concatenate "1" onto the prefix, which is in the form "xxxx:xxxx:xxxx:xxxx::" - snprintf(pVirtIf->IP.Ipv6Data.pdIfAddress, sizeof(pVirtIf->IP.Ipv6Data.pdIfAddress), "%s/64", set_value); // concatenate prefix address with length "/64" - syscfg_set_string(SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, pVirtIf->IP.Ipv6Data.pdIfAddress); - sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_TR_BRLAN0_DHCPV6_SERVER_ADDRESS, set_value, 0); + syscfg_set_string(SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, pVirtIf->IP.Ipv6Data.address); CcspTraceInfo(("%s %d new prefix = %s\n", __FUNCTION__, __LINE__, pVirtIf->IP.Ipv6Data.sitePrefix)); strncat(prefix, "/64",sizeof(prefix)-1); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIX, prefix, 0); From dfa93bac7588f37dd4227dac4ba2f8f38e62efe3 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Mon, 18 Nov 2024 11:30:52 +0000 Subject: [PATCH 44/64] Code cleanup Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 59 ++++++-------------------- 1 file changed, 13 insertions(+), 46 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index e121c73e..3e34fe47 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1616,41 +1616,7 @@ static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* p #endif #define WAN_SUFFIX 1 -// Function to configure the WAN address -int configure_wan_address(struct in6_addr wan_addr, int prefix_length, WANMGR_IPV6_DATA *pIpv6DataNew ) -{ - - wan_addr.s6_addr[prefix_length / 8] += 0x01; // Use next subnet for WAN. First /64 2il be used for LAN. - wan_addr.s6_addr[15] = WAN_SUFFIX; // Setting the last byte for WAN address - inet_ntop(AF_INET6, &wan_addr, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); - - CcspTraceInfo(("%s %d Calculated WAN network IP %s/128 \n", __FUNCTION__, __LINE__, pIpv6DataNew->address)); - //Since this address calculated by us, it will be assigned by the DHCPv6c client. Assign the address on the Wan interface - char cmdLine[256] = {0}; - snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/128 dev %s", pIpv6DataNew->address, pIpv6DataNew->ifname); - if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) - CcspTraceError(("failed to run cmd: %s", cmdLine)); - - return 0; -} - -/* -// Function to configure the LAN address range -int configure_lan_address(struct in6_addr lan_addr, int prefix_length, WANMGR_IPV6_DATA *pIpv6DataNew) -{ - char ip_str[INET6_ADDRSTRLEN]; - // Use the next block for LAN (e.g., increment the relevant byte) - lan_addr.s6_addr[prefix_length / 8] |= 0x02; // Incrementing subnet for LAN - inet_ntop(AF_INET6, &lan_addr, ip_str, sizeof(ip_str)); - //Modify sitefrefix to avoiud overlapping with Wan IP - snprintf(pIpv6DataNew->sitePrefix, sizeof(pIpv6DataNew->sitePrefix), "%s/%d",ip_str,prefix_length); - - CcspTraceInfo(("%s %d Calculated LAN network prefix %s \n", __FUNCTION__, __LINE__, pIpv6DataNew->sitePrefix)); - return 0; -} -*/ - -int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) +int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) { int prefix_length; char iapd_prefix[128] = {0}; @@ -1675,15 +1641,16 @@ int wanmgr_Split_IAPD_for_WAN_LAN(WANMGR_IPV6_DATA *pIpv6DataNew) return -1; } - // Configure WAN and LAN addresses - if (configure_wan_address(prefix, prefix_length, pIpv6DataNew) != 0) - { - return -1; - } -// if (configure_lan_address(prefix, prefix_length, pIpv6DataNew) != 0) - // { - // return -1; - // } + prefix.s6_addr[prefix_length / 8] += 0x01; // Use next subnet for WAN. First /64 will be used for LAN. + prefix.s6_addr[15] = WAN_SUFFIX; // Setting the last byte for WAN address + inet_ntop(AF_INET6, &prefix, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); + + CcspTraceInfo(("%s %d Calculated WAN network IP %s/128 \n", __FUNCTION__, __LINE__, pIpv6DataNew->address)); + //Since this address calculated by us, it will be assigned by the DHCPv6c client. Assign the address on the Wan interface + char cmdLine[256] = {0}; + snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/128 dev %s", pIpv6DataNew->address, pIpv6DataNew->ifname); + if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) + CcspTraceError(("failed to run cmd: %s", cmdLine)); return 0; } @@ -1930,8 +1897,8 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) } else { - CcspTraceInfo(("IANA is not assigned by DHCPV6 and SLAAC. Using the IAPD for Wan Interface \n")); - wanmgr_Split_IAPD_for_WAN_LAN(&Ipv6DataNew); + CcspTraceInfo(("IANA is not assigned by DHCPV6 and SLAAC. Constructing WAN address from the IAPD for Wan Interface \n")); + wanmgr_construct_wan_address_from_IAPD(&Ipv6DataNew); } } From ba6daf016d8dcd3c2202dadfdb12fab86fab0760 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Mon, 18 Nov 2024 15:24:14 +0000 Subject: [PATCH 45/64] Ipv6 addr assignment and sysevent set Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 69 +++++++++++++++++--------- source/WanManager/wanmgr_net_utils.c | 1 + 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 3e34fe47..2eae05aa 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1484,14 +1484,6 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) CcspTraceError(("error, there is not '::' in prefix:%s\n", prefix)); return 1; } -#if 0//def _HUB4_PRODUCT_REQ_ - if(strncmp(intfName, COSA_DML_DHCPV6_SERVER_IFNAME, strlen(intfName)) == 0) - { - snprintf(ipAddr, 128, "%s1", globalIP); - CcspTraceInfo(("the full part is:%s\n", ipAddr)); - return 0; - } -#endif j = i-2; k = 0; @@ -1615,6 +1607,29 @@ static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* p } #endif +/** + * @brief Constructs a dedicated WAN IPv6 address from the received IAPD (IA Prefix Delegation). + * + * This function extracts the IPv6 prefix and its length from the given IAPD data. It then uses + * the provided prefix to construct a unique WAN IPv6 address by using the next available /64 subnet. + * The first /64 subnet of the IAPD is reserved for LAN, while the next /64 is used for the WAN address. + * The constructed WAN address is assigned to the specified WAN interface. + * + * @param[in] pIpv6DataNew Pointer to the WANMGR_IPV6_DATA structure. + * + * @return + * - 0 on success. + * - -1 on failure (e.g., invalid prefix format, prefix length >= 64, or system command failure). + * + * @note The function assumes that if the prefix length is less than 64, there are sufficient bits available + * to split the IAPD into multiple /64 subnets. If the prefix length is 64 or greater, it logs an error + * and returns -1 since further subnetting is not possible. + * + * ### Example: + * Given an IAPD of "2a06:5906:13:d000::/56", the function may construct the following addresses: + * - LAN IPv6 Address Range: "2a06:5906:13:d000::/64" + * - WAN IPv6 Address: "2a06:5906:13:d001::1/128" + */ #define WAN_SUFFIX 1 int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) { @@ -1652,6 +1667,10 @@ int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); + memset(cmdLine, 0, sizeof(cmdLine)); + snprintf(cmdLine, sizeof(cmdLine), COSA_DML_WANIface_ADDR_SYSEVENT_NAME , pIpv6DataNew->ifname); + sysevent_set(sysevent_fd, sysevent_token, cmdLine, pIpv6DataNew->address, 0); + return 0; } @@ -1726,7 +1745,8 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) /* In an IPv6 lease, both IANA and IAPD details are sent together in a struct. * If only one of them is renewed, the other field will be set to its default value. * In this scenario, we should not consider IANA or IAPD as deleted. - * If we reach this point, only IAPD has been renewed. Use the previous IANA details. */ + * If we reach this point, only IAPD has been renewed. Use the previous IANA details. + */ CcspTraceWarning(("%s %d IANA is not assigned in this IPC msg, but we have IANA configured from previous lease. Assuming only IAPD renewed. \n", __FUNCTION__, __LINE__)); strncpy(Ipv6DataNew.address, pDhcp6cInfoCur->address, sizeof(Ipv6DataNew.address)); @@ -1734,6 +1754,20 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) pNewIpcMsg->addrAssigned = true; Ipv6DataNew.addrCmd = pDhcp6cInfoCur->addrCmd; } + else + { + /* In an IPv6 lease, if only IAPD is received and we never received IANA, + * We can use the received IAPD to construct a Ipv6 /128 address which can be used for managerment and voice ... + * If we reach this point, only IAPD has been received. Canculate Wan Ipv6 address + */ + + CcspTraceInfo(("IANA is not assigned by DHCPV6. Constructing WAN address from the IAPD for Wan Interface \n")); + wanmgr_construct_wan_address_from_IAPD(&Ipv6DataNew); + Ipv6DataNew.addrAssigned = true; + pNewIpcMsg->addrAssigned = true; + Ipv6DataNew.addrCmd = pDhcp6cInfoCur->addrCmd; + } + /* dhcp6c receives prefix delegation for LAN */ if (pNewIpcMsg->prefixAssigned && !IS_EMPTY_STRING(pNewIpcMsg->sitePrefix)) @@ -1895,12 +1929,6 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) #endif } } - else - { - CcspTraceInfo(("IANA is not assigned by DHCPV6 and SLAAC. Constructing WAN address from the IAPD for Wan Interface \n")); - wanmgr_construct_wan_address_from_IAPD(&Ipv6DataNew); - } - } /* @@ -1938,6 +1966,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { #if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not add prefix on LAN bridge for the Comcast platforms. //call function for changing the prlft and vallft + //Find sysevent /bus PAI to update LAN prefix lifetime. if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) { CcspTraceError(("Life Time Setting Failed")); @@ -2063,15 +2092,6 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) else { snprintf(pVirtIf->IP.Ipv6Data.pdIfAddress, sizeof(pVirtIf->IP.Ipv6Data.pdIfAddress), "%s/64", globalIP); -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not add prefix on LAN bridge for the Comcast platforms. - CcspTraceInfo(("%s Going to set [%s] address on brlan0 interface \n", __FUNCTION__, globalIP)); - memset(cmdLine, 0, sizeof(cmdLine)); - snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/64 dev %s valid_lft %d preferred_lft %d", - globalIP, COSA_DML_DHCPV6_SERVER_IFNAME, pVirtIf->IP.Ipv6Data.prefixVltime, pVirtIf->IP.Ipv6Data.prefixPltime); - if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) - CcspTraceError(("failed to run cmd: %s", cmdLine)); -#endif - CcspTraceInfo(("%s lan_ipaddr_v6 set to [%s] \n", __FUNCTION__, globalIP)); /*This is for brlan0 interface */ char pref_len[10] ={0}; sscanf (pVirtIf->IP.Ipv6Data.sitePrefix,"%*[^/]/%s" ,pref_len); @@ -2079,6 +2099,7 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) sysevent_set(sysevent_fd, sysevent_token, "lan_ipaddr_v6", globalIP, 0); sysevent_set(sysevent_fd, sysevent_token, "lan_prefix_set", globalIP, 0); //TODO: This was a event to Wanmanager. if no other process listens to it. remove it. sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_TR_BRLAN0_DHCPV6_SERVER_ADDRESS, globalIP, 0); + CcspTraceInfo(("%s lan_ipaddr_v6 set to [%s] \n", __FUNCTION__, globalIP)); } memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 route add %s dev %s", pVirtIf->IP.Ipv6Data.sitePrefix, COSA_DML_DHCPV6_SERVER_IFNAME); diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index eef337c3..394f79ef 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -489,6 +489,7 @@ int WanManager_Ipv6AddrUtil(char *ifname, Ipv6OperType opr, int preflft, int val if (strlen(prefix) > 0) { #if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) //Do not delete prefix from LAn bridge for the comcast platforms. + //TODO: Find a sysevent/bus api to remove lan prefix address from LAN bridge. WAN manager shouldn't configure LAN address. memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr del %s/64 dev %s", prefixAddr, IfaceName); if (WanManager_DoSystemActionWithStatus("ip -6 addr del ADDR dev xxxx", cmdLine) != 0) From 60d5bb39f264dbe92d6bd7440dcc189017c64939 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Thu, 5 Dec 2024 11:38:57 +0000 Subject: [PATCH 46/64] Adding net.netfilter.nf_conntrack_udp_timeout and net.netfilter.nf_conntrack_udp_timeout_stream for Comcast platforms Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_net_utils.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index eef337c3..0c86bae6 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -1234,6 +1234,21 @@ int WanManager_ProcessMAPTConfiguration(ipc_mapt_data_t *dhcp6cMAPTMsgBody, WANM } #endif // NAT46_KERNEL_SUPPORT +#if defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) + // override udp timeout for mapt + CcspTraceInfo(("%s %d :Setting nf_conntrack_udp_timeout to 30 seconds for MAPT! \n", __FUNCTION__, __LINE__)); + if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout=30") ) + { + CcspTraceError(("%s %d : Failed to set nf_conntrack_udp_timeout! \n", __FUNCTION__, __LINE__)); + } + + CcspTraceInfo(("%s %d :Setting nf_conntrack_udp_timeout_stream to 120 seconds for MAPT! \n", __FUNCTION__, __LINE__)); + if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout_stream=120") ) + { + CcspTraceError(("%s %d : Failed to set nf_conntrack_udp_timeout_stream! \n", __FUNCTION__, __LINE__)); + } +#endif + #if defined(IVI_KERNEL_SUPPORT) || (NAT46_KERNEL_SUPPORT) /** * Firewall rules are changed to utopia firewall From 356fa9094cf5a6d68b7e5b17413163ab767f4259 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Tue, 10 Dec 2024 15:59:54 +0000 Subject: [PATCH 47/64] Adding commenst for nf_conntrack_udp_timeout_stream Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_net_utils.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 0c86bae6..68f20d56 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -1234,8 +1234,13 @@ int WanManager_ProcessMAPTConfiguration(ipc_mapt_data_t *dhcp6cMAPTMsgBody, WANM } #endif // NAT46_KERNEL_SUPPORT +/* + * Any VoIP/SIP application running on the CPE itself or in the home LAN, MUST send some form of SIP keepalives (Options or Register messages), + * more frequent than the nf_conntrack_udp_timeout_stream value to allow unsolicited inbound calls to not be blocked by the firewall. + * Either increase this value above the SIP keepalive frequency, or ensure SIP applications are configured to send keepalives more frequent than Linux's default value of 120 seconds. + */ #if defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) - // override udp timeout for mapt + // This is a configuration specific for Comcast. Sky devices has nf_conntrack_udp_timeout_stream set to 300 seconds. CcspTraceInfo(("%s %d :Setting nf_conntrack_udp_timeout to 30 seconds for MAPT! \n", __FUNCTION__, __LINE__)); if ( v_secure_system("sysctl -w net.netfilter.nf_conntrack_udp_timeout=30") ) { From c32564a1790d2af31ecedc00ca721743663e0a82 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Mon, 13 Jan 2025 14:42:47 +0000 Subject: [PATCH 48/64] Including PSM changes for network configurations. Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 57 +++++++++++++------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index b47b4421..073d8b86 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1485,29 +1485,6 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) return 1; } -#if defined(_HUB4_PRODUCT_REQ_) || defined(_RDKB_GLOBAL_PRODUCT_REQ_) -#if defined(_RDKB_GLOBAL_PRODUCT_REQ_) - WanMgr_Config_Data_t *pWanConfigData = WanMgr_GetConfigData_locked(); - unsigned char IPv6EUI64FormatSupport = TRUE; - - if( NULL != pWanConfigData ) - { - IPv6EUI64FormatSupport = pWanConfigData->data.IPv6EUI64FormatSupport; - WanMgrDml_GetConfigData_release(pWanConfigData); - } - - if ( FALSE == IPv6EUI64FormatSupport ) -#endif /** _RDKB_GLOBAL_PRODUCT_REQ_ */ - { - if(strncmp(intfName, COSA_DML_DHCPV6_SERVER_IFNAME, strlen(intfName)) == 0) - { - snprintf(ipAddr, 128, "%s1", globalIP); - CcspTraceInfo(("the full part is:%s\n", ipAddr)); - return 0; - } - } -#endif - j = i-2; k = 0; while( j>0 ){ @@ -1654,11 +1631,11 @@ static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* p * - WAN IPv6 Address: "2a06:5906:13:d001::1/128" */ #define WAN_SUFFIX 1 -int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) +static int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) { int prefix_length; char iapd_prefix[128] = {0}; - + char cmdLine[256] = {0}; if (sscanf(pIpv6DataNew->sitePrefix, "%[^/]/%d", iapd_prefix, &prefix_length) != 2) { return -1; // Parsing failed @@ -1679,13 +1656,35 @@ int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) return -1; } - prefix.s6_addr[prefix_length / 8] += 0x01; // Use next subnet for WAN. First /64 will be used for LAN. - prefix.s6_addr[15] = WAN_SUFFIX; // Setting the last byte for WAN address - inet_ntop(AF_INET6, &prefix, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); + prefix.s6_addr[7] += 0x01; // Use next subnet for WAN. First /64 will be used for LAN. + + WanMgr_Config_Data_t *pWanConfigData = WanMgr_GetConfigData_locked(); + unsigned char IPv6EUI64FormatSupport = TRUE; + if( NULL != pWanConfigData ) + { + IPv6EUI64FormatSupport = pWanConfigData->data.IPv6EUI64FormatSupport; + WanMgrDml_GetConfigData_release(pWanConfigData); + } + + if(IPv6EUI64FormatSupport) + { + char newPref[128] = {0}; + inet_ntop(AF_INET6, &prefix, newPref, sizeof(newPref)); + CcspTraceInfo(("%s %d EUI64 format is enabled using new prefix %s \n", __FUNCTION__, __LINE__, newPref)); + snprintf(cmdLine, sizeof(cmdLine), "%s/%d", newPref, prefix_length); + dhcpv6_assign_global_ip(cmdLine, pIpv6DataNew->ifname, pIpv6DataNew->address); + } + else + { + CcspTraceInfo(("%s %d EUI64 format is not enabled using WAN SUFFIX %d \n", __FUNCTION__, __LINE__, WAN_SUFFIX)); + prefix.s6_addr[15] = WAN_SUFFIX; // Setting the last byte for WAN address + inet_ntop(AF_INET6, &prefix, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); + } + CcspTraceInfo(("%s %d Calculated WAN network IP %s/128 \n", __FUNCTION__, __LINE__, pIpv6DataNew->address)); //Since this address calculated by us, it will be assigned by the DHCPv6c client. Assign the address on the Wan interface - char cmdLine[256] = {0}; + memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr add %s/128 dev %s", pIpv6DataNew->address, pIpv6DataNew->ifname); if (WanManager_DoSystemActionWithStatus(__FUNCTION__, cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); From 8d90cb37a2ff94c606786d29b22f98bc6b5cdb16 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Fri, 24 Jan 2025 14:00:26 +0000 Subject: [PATCH 49/64] Modifying IPOE healch echk apis Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_ipc.c | 37 +++++----------------------------- source/WanManager/wanmgr_ipc.h | 2 +- 2 files changed, 6 insertions(+), 33 deletions(-) diff --git a/source/WanManager/wanmgr_ipc.c b/source/WanManager/wanmgr_ipc.c index 129961ad..d6e1928f 100644 --- a/source/WanManager/wanmgr_ipc.c +++ b/source/WanManager/wanmgr_ipc.c @@ -357,7 +357,7 @@ static void WanMgr_RemoveSingleQuote(char *buf) return 0; } -ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, char *ifName) +ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, DML_VIRTUAL_IFACE *p_VirtIf ) { int sock = -1; int conn = -1; @@ -370,25 +370,7 @@ ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, char *ifName) if (msgType == IPOE_MSG_WAN_CONNECTION_IPV6_UP) { // V6 UP Message needs Wan V6 IP - char* pattern = NULL; - char ipv6_prefix[INET6_ADDRSTRLEN] = {0}; - - sysevent_get(sysevent_fd, sysevent_token, SYSCFG_FIELD_IPV6_PREFIX, ipv6_prefix, sizeof(ipv6_prefix)); - if(ipv6_prefix == NULL || *ipv6_prefix == '\0'|| (0 == strncmp(ipv6_prefix, "(null)", strlen("(null)")))) - { - CcspTraceError(("[%s-%d] Unable to get ipv6_prefix..\n", __FUNCTION__, __LINE__)); - return ANSC_STATUS_FAILURE; - } - - pattern = strstr(ipv6_prefix, "/"); - if (pattern == NULL) - { - CcspTraceError(("[%s-%d] Invalid ipv6_prefix :%s\n", __FUNCTION__, __LINE__, ipv6_prefix)); - return ANSC_STATUS_FAILURE; - } - sprintf(pattern, "%c%c", '1', '\0'); //Form the global address with ::1 - strncpy(msgBody.ipv6Address, ipv6_prefix, sizeof(ipv6_prefix)); - + strncpy(msgBody.ipv6Address, p_VirtIf->IP.Ipv6Data.address, sizeof(msgBody.ipv6Address) - 1); if( 0 == syscfg_get( NULL, "ntp_server1", domainName, sizeof(domainName)) ) { WanMgr_RemoveSingleQuote(domainName); @@ -403,16 +385,7 @@ ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, char *ifName) } else if (msgType == IPOE_MSG_WAN_CONNECTION_UP) { - char ipv4_wan_address[IP_ADDR_LENGTH] = {0}; - char sysevent_param_name[BUFLEN_64] = {0}; - snprintf(sysevent_param_name, sizeof(sysevent_param_name), SYSEVENT_IPV4_IP_ADDRESS, ifName); - sysevent_get(sysevent_fd, sysevent_token, sysevent_param_name, ipv4_wan_address, sizeof(ipv4_wan_address)); - if(ipv4_wan_address == NULL || *ipv4_wan_address == '\0'|| (0 == strncmp(ipv4_wan_address, "(null)", strlen("(null)")))) - { - CcspTraceError(("[%s-%d] Unable to get ipv4_erouter0_ipaddr..\n", __FUNCTION__, __LINE__)); - return ANSC_STATUS_FAILURE; - } - strncpy(msgBody.ipv4Address, ipv4_wan_address, sizeof(ipv4_wan_address)); + strncpy(msgBody.ipv4Address, p_VirtIf->IP.Ipv4Data.ip, sizeof(msgBody.ipv4Address)-1); if( 0 == syscfg_get( NULL, "ntp_server1", domainName, sizeof(domainName)) ) { @@ -426,9 +399,9 @@ ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, char *ifName) CcspTraceInfo(("[%s-%d] Sending IPOE_MSG_WAN_CONNECTION_UP msg with addr :%s and domainName: [%s] \n", __FUNCTION__, __LINE__, msgBody.ipv4Address, msgBody.domainName)); } - strncpy(msgBody.ifName, ifName, IFNAME_LENGTH-1); + strncpy(msgBody.ifName, p_VirtIf->Name, IFNAME_LENGTH-1); - CcspTraceInfo(("[%s-%d] Sending msg = %d for interface %s \n", __FUNCTION__, __LINE__, msgType, ifName)); + CcspTraceInfo(("[%s-%d] Sending msg = %d for interface %s \n", __FUNCTION__, __LINE__, msgType, p_VirtIf->Name)); int bytes = 0; int msgSize = sizeof(ipc_ihc_data_t); diff --git a/source/WanManager/wanmgr_ipc.h b/source/WanManager/wanmgr_ipc.h index f0d6d8b2..d8a716b7 100644 --- a/source/WanManager/wanmgr_ipc.h +++ b/source/WanManager/wanmgr_ipc.h @@ -27,7 +27,7 @@ #include "wanmgr_interface_sm.h" #ifdef FEATURE_IPOE_HEALTH_CHECK -ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, char *ifName); +ANSC_STATUS WanMgr_SendMsgToIHC (ipoe_msg_type_t msgType, DML_VIRTUAL_IFACE *p_VirtIf); #endif From f37c08d5c331cfcd1e6827460d5131d4ef515133 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Mon, 27 Jan 2025 12:49:13 +0000 Subject: [PATCH 50/64] Fixing WanMgr_SendMsgToIHC funtion call Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 1587e6e0..cf0378df 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1708,14 +1708,14 @@ static ANSC_STATUS WanMgr_SendMsgTo_ConnectivityCheck(WanMgr_IfaceSM_Controller_ //Restarting firewall to add IPOE_HEALTH_CHECK firewall rules. sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); } - WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_UP, p_VirtIf->Name); + WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_UP, p_VirtIf); pWanIfaceCtrl->IhcV4Status = IHC_STARTED; } } else if(type == CONNECTION_MSG_IPV4 && ConnStatus == FALSE) { CcspTraceInfo(("%s %d Sending IPOE_MSG_WAN_CONNECTION_DOWN \n", __FUNCTION__, __LINE__)); - WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_DOWN, p_VirtIf->Name); + WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_DOWN, p_VirtIf); pWanIfaceCtrl->IhcV4Status = IHC_STOPPED; } else if(type == CONNECTION_MSG_IPV6 && ConnStatus == TRUE) @@ -1730,14 +1730,14 @@ static ANSC_STATUS WanMgr_SendMsgTo_ConnectivityCheck(WanMgr_IfaceSM_Controller_ //Restarting firewall to add IPOE_HEALTH_CHECK firewall rules. sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); } - WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_IPV6_UP, p_VirtIf->Name); + WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_IPV6_UP, p_VirtIf); pWanIfaceCtrl->IhcV6Status = IHC_STARTED; } } else if(type == CONNECTION_MSG_IPV6 && ConnStatus == FALSE) { CcspTraceInfo(("%s %d Sending IPOE_MSG_WAN_CONNECTION_IPV6_DOWN \n", __FUNCTION__, __LINE__)); - WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_IPV6_DOWN, p_VirtIf->Name); + WanMgr_SendMsgToIHC(IPOE_MSG_WAN_CONNECTION_IPV6_DOWN, p_VirtIf); pWanIfaceCtrl->IhcV6Status = IHC_STOPPED; } From 57e6d9c10f77fb9bd2615689f84db294a0d85bcb Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Wed, 5 Feb 2025 13:13:47 +0000 Subject: [PATCH 51/64] Removing IPOE LAN dependancy changes Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 40 +------------------------ source/WanManager/wanmgr_sysevents.c | 4 --- source/WanManager/wanmgr_sysevents.h | 12 -------- 3 files changed, 1 insertion(+), 55 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index f16c3e74..5b148e77 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -54,9 +54,6 @@ #define POSTD_START_FILE "/tmp/.postd_started" #define SELECTED_MODE_TIMEOUT_SECONDS 10 -#if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) -extern lanState_t lanState; -#endif #if defined(FEATURE_464XLAT) typedef enum @@ -3582,18 +3579,6 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC WanMgr_CheckDefaultRA(p_VirtIf); -#if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) - if(lanState == LAN_STATE_STOPPED) - { - WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , FALSE); - lanState = LAN_STATE_RESET; - } - else if(lanState == LAN_STATE_STARTED) - { - WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , TRUE); - lanState = LAN_STATE_RESET; - } -#endif return WAN_STATE_IPV6_LEASED; } @@ -3727,18 +3712,6 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan WanMgr_MonitorDhcpApps(pWanIfaceCtrl); WanMgr_CheckDefaultRA(p_VirtIf); -#if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) - if(lanState == LAN_STATE_STOPPED) - { - WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , FALSE); - lanState = LAN_STATE_RESET; - } - else if(lanState == LAN_STATE_STARTED) - { - WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , TRUE); - lanState = LAN_STATE_RESET; - } -#endif return WAN_STATE_DUAL_STACK_ACTIVE; } @@ -3872,18 +3845,7 @@ static eWanState_t wan_state_mapt_active(WanMgr_IfaceSM_Controller_t* pWanIfaceC WanMgr_MonitorDhcpApps(pWanIfaceCtrl); WanMgr_CheckDefaultRA(p_VirtIf); -#if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) - if(lanState == LAN_STATE_STOPPED) - { - WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , FALSE); - lanState = LAN_STATE_RESET; - } - else if(lanState == LAN_STATE_STARTED) - { - WanMgr_SendMsgTo_ConnectivityCheck(pWanIfaceCtrl, CONNECTION_MSG_IPV6 , TRUE); - lanState = LAN_STATE_RESET; - } -#endif + return WAN_STATE_MAPT_ACTIVE; } #endif //FEATURE_MAPT diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 4675e832..4da15e89 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -76,10 +76,6 @@ static int set_default_conf_entry(); int mapt_feature_enable_changed = FALSE; #endif -#if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) -lanState_t lanState = LAN_STATE_RESET; -#endif - #if defined(_DT_WAN_Manager_Enable_) bool needDibblerRestart = TRUE; #endif diff --git a/source/WanManager/wanmgr_sysevents.h b/source/WanManager/wanmgr_sysevents.h index 0e856c52..a7c16932 100644 --- a/source/WanManager/wanmgr_sysevents.h +++ b/source/WanManager/wanmgr_sysevents.h @@ -195,18 +195,6 @@ #define WANMNGR_INTERFACE_DEFAULT_MTU_SIZE (1500) -/* IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT - stops and starts IPOE HEALTH CHECK Service based on lan events(SYSEVENT_LAN_STATUS). - * SKY IPoE Health check depends on the global ipv6 address configured on brlan0 and during the lan stop event brlan0 interface - * is made down affecting the IPoE service. - * */ -#if defined(FEATURE_IPOE_HEALTH_CHECK) && defined(IPOE_HEALTH_CHECK_LAN_SYNC_SUPPORT) -typedef enum{ - LAN_STATE_RESET = 0, - LAN_STATE_STOPPED, - LAN_STATE_STARTED, -}lanState_t; -#endif - //Bridge Mode #if defined(WAN_MANAGER_UNIFICATION_ENABLED) #define SYSEVENT_BRIDGE_MODE "bridge_mode" From 24a976c2944ad0d85524d1dffa53b6d027fd1070 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Wed, 5 Feb 2025 14:50:48 +0000 Subject: [PATCH 52/64] Removing LAN bridge IPv6 deletion and life time update from the WanManager Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 25 +------ source/WanManager/wanmgr_interface_sm.c | 6 +- source/WanManager/wanmgr_net_utils.c | 92 ++++++++----------------- source/WanManager/wanmgr_net_utils.h | 8 +-- 4 files changed, 34 insertions(+), 97 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index e3f6c292..e0f635a6 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1950,32 +1950,9 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) { if(pVirtIf->Status == WAN_IFACE_STATUS_UP && pNewIpcMsg->prefixPltime > 0 && pNewIpcMsg->prefixVltime > 0 ) //Update life time only if the interface is active. { -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) || defined(_RDKB_GLOBAL_PRODUCT_REQ_) //Do not add prefix on LAN bridge for the Comcast platforms. - //call function for changing the prlft and vallft - //Find sysevent /bus API to update LAN prefix lifetime. -#if defined(_RDKB_GLOBAL_PRODUCT_REQ_) - - WanMgr_Config_Data_t *pWanConfigData = WanMgr_GetConfigData_locked(); - unsigned char ConfigureWANIPv6OnLANBridgeSupport = FALSE; - - if( NULL != pWanConfigData ) - { - ConfigureWANIPv6OnLANBridgeSupport = pWanConfigData->data.ConfigureWANIPv6OnLANBridgeSupport; - WanMgrDml_GetConfigData_release(pWanConfigData); - } - - if ( TRUE == ConfigureWANIPv6OnLANBridgeSupport ) -#endif /** _RDKB_GLOBAL_PRODUCT_REQ_ */ - { - //call function for changing the prlft and vallft - if ((WanManager_Ipv6AddrUtil(pVirtIf->Name, SET_LFT, pNewIpcMsg->prefixPltime, pNewIpcMsg->prefixVltime) < 0)) - { - CcspTraceError(("Life Time Setting Failed")); - } + //TODO : RADVD restart required for ipv6 renew ? sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); } -#endif - } pVirtIf->IP.Ipv6Renewed = TRUE; } // update current IPv6 Data diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 5b148e77..9512888a 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1269,7 +1269,6 @@ static int wan_tearDownIPv4(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) unsigned char BackupWanDnsSupport = TRUE; if( NULL != pWanConfigData ) - { BackupWanDnsSupport = pWanConfigData->data.BackupWanDnsSupport; WanMgrDml_GetConfigData_release(pWanConfigData); @@ -1470,10 +1469,10 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) ret = RETURN_ERR; } } - #endif + /** Unconfig IPv6. */ - if ( WanManager_Ipv6AddrUtil(p_VirtIf->Name, DEL_ADDR,0,0) < 0) + if ( WanManager_Ipv6AddrUtil(p_VirtIf, DEL_ADDR) < 0) { AnscTraceError(("%s %d - Failed to remove inactive address \n", __FUNCTION__,__LINE__)); } @@ -1499,6 +1498,7 @@ static int wan_tearDownIPv6(WanMgr_IfaceSM_Controller_t * pWanIfaceCtrl) sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIREWALL_RESTART, NULL, 0); //RBUS_WAN_IP +//TODO : **************************** Check this ************************ #if defined (RBUS_WAN_IP) #if defined(_RDKB_GLOBAL_PRODUCT_REQ_) unsigned char ConfigureWANIPv6OnLANBridgeSupport = FALSE; diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index c71a79f3..0a2d491c 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -325,108 +325,72 @@ int isModuleLoaded(char *moduleName) ****************************************************************************/ static INT IsIPObtained(char *pInterfaceName); -int WanManager_Ipv6AddrUtil(char *ifname, Ipv6OperType opr, int preflft, int vallft) +/*************************************************************************** + * @brief Utility function used to perform operation on IPV6 addresses + * for a particular interface + * @param p_VirtIf Pointer to the virtual interface + * @param opr indicates operation type (Delete/Set) + * @return 0 upon success else -1 returned + ***************************************************************************/ +int WanManager_Ipv6AddrUtil(DML_VIRTUAL_IFACE* p_VirtIf,Ipv6OperType opr) { char cmdLine[128] = {0}; - char prefix[BUFLEN_48] = {0}; - char prefixAddr[BUFLEN_48] = {0}; - char Output[BUFLEN_16] = {0}; - char IfaceName[BUFLEN_16] = {0}; - int BridgeMode = 0; - - memset(prefix, 0, sizeof(prefix)); - sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIX, prefix, sizeof(prefix)); - - memset(prefixAddr, 0, sizeof(prefixAddr)); - sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_GLOBAL_IPV6_PREFIX_SET, prefixAddr, sizeof(prefixAddr)); - - /*TODO: - *Below Code should be removed once V6 Prefix/IP is assigned on erouter0 Instead of brlan0 for sky Devices. - */ - strcpy(IfaceName, LAN_BRIDGE_NAME); - sysevent_get(sysevent_fd, sysevent_token, "bridge_mode", Output, sizeof(Output)); - BridgeMode = atoi(Output); - if (BridgeMode != 0) - { - memset(IfaceName, 0, sizeof(IfaceName)); - strncpy(IfaceName, ifname, strlen(ifname)); - } - - CcspTraceInfo(("%s-%d: IfaceName=%s, BridgeMode=%d \n", __FUNCTION__, __LINE__, IfaceName, BridgeMode)); switch (opr) { case DEL_ADDR: { - if (strlen(prefix) > 0) + if (strlen( p_VirtIf->IP.Ipv6Data.address) > 0) { -#if !(defined (_XB6_PRODUCT_REQ_) || defined (_CBR2_PRODUCT_REQ_) || defined(_PLATFORM_RASPBERRYPI_)) || defined(_RDKB_GLOBAL_PRODUCT_REQ_) //Do not delete prefix from LAn bridge for the comcast platforms. -#if defined(_RDKB_GLOBAL_PRODUCT_REQ_) - WanMgr_Config_Data_t *pWanConfigData = WanMgr_GetConfigData_locked(); - unsigned char ConfigureWANIPv6OnLANBridgeSupport = FALSE; - - if( NULL != pWanConfigData ) - { - ConfigureWANIPv6OnLANBridgeSupport = pWanConfigData->data.ConfigureWANIPv6OnLANBridgeSupport; - WanMgrDml_GetConfigData_release(pWanConfigData); - } + memset(cmdLine, 0, sizeof(cmdLine)); + snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr del %s/64 dev %s", p_VirtIf->IP.Ipv6Data.address, p_VirtIf->Name); + if (WanManager_DoSystemActionWithStatus("ip -6 addr del ADDR dev xxxx", cmdLine) != 0) + CcspTraceError(("failed to run cmd: %s", cmdLine)); - if ( TRUE == ConfigureWANIPv6OnLANBridgeSupport ) -#endif /** _RDKB_GLOBAL_PRODUCT_REQ_ */ - { - //TODO: Find a sysevent/bus api to remove lan prefix address from LAN bridge. WAN manager shouldn't configure LAN address. - memset(cmdLine, 0, sizeof(cmdLine)); - snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr del %s/64 dev %s", prefixAddr, IfaceName); - if (WanManager_DoSystemActionWithStatus("ip -6 addr del ADDR dev xxxx", cmdLine) != 0) - CcspTraceError(("failed to run cmd: %s", cmdLine)); - } -#endif memset(cmdLine, 0, sizeof(cmdLine)); -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - snprintf(cmdLine, sizeof(cmdLine), "ip -6 route flush match %s ", prefix); -#else - snprintf(cmdLine, sizeof(cmdLine), "ip -6 route flush %s ", prefix); -#endif - if (WanManager_DoSystemActionWithStatus("ip -6 route flush PREFIX ", cmdLine) != 0) + snprintf(cmdLine, sizeof(cmdLine), "ip -6 route flush match %s ", p_VirtIf->IP.Ipv6Data.address); + + if (WanManager_DoSystemActionWithStatus(cmdLine, cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); - CcspTraceInfo(("%s-%d: Successfully del addr and route from Interface %s, prefix=%s, prefixAddr=%s \n", - __FUNCTION__, __LINE__, IfaceName, prefix, prefixAddr)); + CcspTraceInfo(("%s-%d: Successfully del addr and route from Interface %s, Ipv6 Addr=%s \n", + __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Ipv6Data.address)); memset(cmdLine, 0, sizeof(cmdLine)); snprintf(cmdLine, sizeof(cmdLine), "ip -6 route delete default"); if (WanManager_DoSystemActionWithStatus("ip -6 route delete default", cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); + CcspTraceInfo(("%s-%d: Successfully deleted ipv6 default route\n", __FUNCTION__, __LINE__)); } else { - CcspTraceError(("%s-%d: Failed to delete addr and route from Interface %s, prefix=%s, prefixAddr=%s \n", - __FUNCTION__, __LINE__, IfaceName, prefix, prefixAddr)); + CcspTraceError(("%s-%d: Failed to delete addr and route from Interface %s, IPv6 Addr=%s \n", + __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Ipv6Data.address)); } break; } + case SET_LFT: { - if (strlen(prefixAddr) > 0) + if (strlen(p_VirtIf->IP.Ipv6Data.address) > 0) { memset(cmdLine, 0, sizeof(cmdLine)); - snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr change %s dev %s valid_lft %d preferred_lft %d ", prefixAddr, IfaceName, vallft, preflft); + snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr change %s dev %s valid_lft %d preferred_lft %d ", p_VirtIf->IP.Ipv6Data.address, p_VirtIf->Name, p_VirtIf->IP.Ipv6Data.prefixVltime, p_VirtIf->IP.Ipv6Data.prefixPltime); if (WanManager_DoSystemActionWithStatus("processDhcp6cStateChanged: ip -6 addr change L3IfName", (cmdLine)) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); - CcspTraceInfo(("%s-%d: Successfully updated addr from Interface %s, prefixAddr=%s, vallft=%d, preflft=%d \n", - __FUNCTION__, __LINE__, IfaceName, prefixAddr, vallft, preflft)); + CcspTraceInfo(("%s-%d: Successfully updated addr from Interface %s, Ipv6 Addr=%s, vallft=%d, preflft=%d \n", + __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Ipv6Data.address, p_VirtIf->IP.Ipv6Data.prefixVltime, p_VirtIf->IP.Ipv6Data.prefixPltime)); } else { - CcspTraceError(("%s-%d: Failed to update addr from Interface %s, prefixAddr=%s, vallft=%d, preflft=%d \n", - __FUNCTION__, __LINE__, IfaceName, prefixAddr, vallft, preflft)); + CcspTraceError(("%s-%d: Failed to update addr from Interface %s, Ipv6 Addr=%s, vallft=%d, preflft=%d \n", + __FUNCTION__, __LINE__, p_VirtIf->Name, p_VirtIf->IP.Ipv6Data.address, p_VirtIf->IP.Ipv6Data.prefixVltime, p_VirtIf->IP.Ipv6Data.prefixPltime)); } break; } } - return 0; } diff --git a/source/WanManager/wanmgr_net_utils.h b/source/WanManager/wanmgr_net_utils.h index 9494b332..f4c8244b 100644 --- a/source/WanManager/wanmgr_net_utils.h +++ b/source/WanManager/wanmgr_net_utils.h @@ -37,8 +37,6 @@ #define PTM_IFC_STR "ptm" #define PHY_WAN_IF_NAME "erouter0" #define ETH_BRIDGE_NAME "brlan0" -#define LAN_BRIDGE_NAME "brlan0" -// #define WAN_STATUS_UP "up" #define WAN_STATUS_DOWN "down" @@ -140,13 +138,11 @@ BOOL WanManager_IsApplicationRunning(const char *appName, const char * args); /*************************************************************************** * @brief Utility function used to perform operation on IPV6 addresses * for a particular interface - * @param ifname string indicates interface name + * @param p_VirtIf Pointer to the virtual interface * @param opr indicates operation type (Delete/Set) - * @param preflft indicates preferred lifetime - * @param vallft indicates valid lifetime * @return 0 upon success else -1 returned ***************************************************************************/ -int WanManager_Ipv6AddrUtil(char *ifname,Ipv6OperType opr,int preflft,int vallft); +int WanManager_Ipv6AddrUtil(DML_VIRTUAL_IFACE* p_VirtIf,Ipv6OperType opr); /*************************************************************************** * @brief Utility function used to check a process is running using PID From ef40e8575cee35d257469f16a0946edb12673a24 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 7 Feb 2025 12:22:57 +0000 Subject: [PATCH 53/64] Fixing dhcpv6_assign_global_ip funtion name Signed-off-by: S-Parthiban-Selvaraj --- .../middle_layer_src/wanmgr_rdkbus_common.h | 1 - source/WanManager/wanmgr_dhcpv6_apis.c | 29 +++++++++++++++---- source/WanManager/wanmgr_dhcpv6_apis.h | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_common.h b/source/TR-181/middle_layer_src/wanmgr_rdkbus_common.h index 9abbff8f..7e437816 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_common.h +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_common.h @@ -90,7 +90,6 @@ typedef struct _CONTEXT_LINK_OBJECT #define DML_ALIAS_NAME_LENGTH 64 #define DML_DHCP_CLIENT_IFNAME "erouter0" -#define CFG_TR181_DHCPv6_SERVER_IfName "brlan0" ANSC_STATUS SListPushEntryByInsNum (PSLIST_HEADER pListHead, PCONTEXT_LINK_OBJECT pLinkContext); diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index e0f635a6..2dad1b5e 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1406,8 +1406,14 @@ WanMgr_DmlDhcpv6Remove(ANSC_HANDLE hContext) } #if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) - /* dhcpv6_assign_global_ip Copied from PAM module */ -int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) +/** +@brief Generates a full IPv6 address in EUI-64 format from a delegated prefix. +@param prefix The delegated IPv6 prefix. +@param intfName The name of the network interface. +@param ipAddr The buffer to store the generated IPv6 address. +@return int 0 on success, non-zero on failure. +*/ +static int WanMgr_create_eui64_ipv6_address(char * prefix, char * intfName, char * ipAddr) { unsigned int length = 0; @@ -1465,6 +1471,7 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) CcspTraceInfo(("the first part is:%s\n", globalIP)); /* prepare second part */ + /* Step 1: Extract the MAC address of the specified network interface */ fp = v_secure_popen("r", "ifconfig %s | grep HWaddr", intfName ); _get_shell_output(fp, out, sizeof(out)); v_secure_pclose(fp); @@ -1477,6 +1484,7 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) while( pMac && (pMac[0] == ' ') ) pMac++; + /* Step 2: Toggle the 7th bit of the first byte of the MAC address */ /* switch 7bit to 1*/ tmp[0] = pMac[1]; @@ -1491,12 +1499,14 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) pMac[1] = k; pMac[17] = '\0'; + /* Step 3: Insert the "FF:FE" sequence in the middle of the MAC address */ //00:50:56: FF:FE: 92:00:22 _ansc_strncpy(out, pMac, 9); out[9] = '\0'; _ansc_strcat(out, "FF:FE:"); _ansc_strcat(out, pMac+9); + /* Step 4: Format the resulting string into the IPv6 address format */ for(k=0,j=0;out[j];j++){ if ( out[j] == ':' ) continue; @@ -1509,7 +1519,7 @@ int dhcpv6_assign_global_ip(char * prefix, char * intfName, char * ipAddr) globalIP[i-1] = '\0'; - CcspTraceInfo(("the full part is:%s\n", globalIP)); + CcspTraceInfo(("The generated Ip v6 address for interface %s is:%s\n",intfName, globalIP)); _ansc_strncpy(ipAddr, globalIP, sizeof(globalIP) - 1); /* This IP should be unique. If not I have no idea. */ return 0; @@ -1635,7 +1645,7 @@ static int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew inet_ntop(AF_INET6, &prefix, newPref, sizeof(newPref)); CcspTraceInfo(("%s %d EUI64 format is enabled using new prefix %s \n", __FUNCTION__, __LINE__, newPref)); snprintf(cmdLine, sizeof(cmdLine), "%s/%d", newPref, prefix_length); - dhcpv6_assign_global_ip(cmdLine, pIpv6DataNew->ifname, pIpv6DataNew->address); + WanMgr_create_eui64_ipv6_address(cmdLine, pIpv6DataNew->ifname, pIpv6DataNew->address); } else { @@ -2009,6 +2019,14 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) return ANSC_STATUS_SUCCESS; } /* End of ProcessDhcp6cStateChanged() */ +/** + * @brief Sets up the IPv6 /128 address for the LAN bridge. + * This function creates an IPv6 /128 address for the LAN bridge, + * configures all necessary system events for the IPv6 LAN, + * and restarts the DHCPv6 server and RA server if required. + * @param pVirtIf Pointer to the virtual interface structure. + * @return int 0 on success, non-zero on failure. + */ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) { if (pVirtIf == NULL) @@ -2064,7 +2082,8 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) if (pVirtIf->IP.Ipv6Data.prefixPltime != 0 && pVirtIf->IP.Ipv6Data.prefixVltime != 0) { - ret = dhcpv6_assign_global_ip(pVirtIf->IP.Ipv6Data.sitePrefix, COSA_DML_DHCPV6_SERVER_IFNAME, globalIP); + //Create a global IP for the LAN bridge from the received delegated prefix. + ret = WanMgr_create_eui64_ipv6_address(pVirtIf->IP.Ipv6Data.sitePrefix, COSA_DML_DHCPV6_SERVER_IFNAME, globalIP); if(ret != 0) { CcspTraceInfo(("Assign global ip error \n")); } diff --git a/source/WanManager/wanmgr_dhcpv6_apis.h b/source/WanManager/wanmgr_dhcpv6_apis.h index daea297e..1f038f55 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.h +++ b/source/WanManager/wanmgr_dhcpv6_apis.h @@ -49,7 +49,7 @@ #define ULOGF #endif -#define COSA_DML_DHCPV6_SERVER_IFNAME CFG_TR181_DHCPv6_SERVER_IfName +#define COSA_DML_DHCPV6_SERVER_IFNAME "brlan0" #define COSA_DML_DHCPV6C_PREF_SYSEVENT_NAME "tr_"DML_DHCP_CLIENT_IFNAME"_dhcpv6_client_v6pref" #define COSA_DML_DHCPV6C_PREF_IAID_SYSEVENT_NAME "tr_"DML_DHCP_CLIENT_IFNAME"_dhcpv6_client_pref_iaid" From d75a9a7e4d2fb6447d080c8d072ce23248920d5c Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 7 Feb 2025 13:00:26 +0000 Subject: [PATCH 54/64] Modifying DAD check from LAn to WAn interface Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 67 ++++++++++--------------- 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 9512888a..2344ca06 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -182,7 +182,7 @@ static ANSC_STATUS WanManager_ClearDHCPData(DML_VIRTUAL_IFACE * pVirtIf); * lan ipv6 address ready to use. * @return RETURN_OK on success else RETURN_ERR *************************************************************************************/ -static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf); +static int checkIpv6AddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf); #ifdef FEATURE_MAPT @@ -947,51 +947,37 @@ int wan_updateDNS(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl, BOOL addIPv4, BOOL return ret; } -/* Check Duplicate Address Detection (DAD) status. The way it works is that - after an address is added to an interface, the operating system uses the - Neighbor Discovery Protocol to check if any other host on the network - has the same address. The whole process will take around 3 to 4 seconds - to complete. Also we need to check and ensure that the gateway has - a valid default route entry. + +/** + * @brief Checks if the IPv6 address is ready to use. + * + * This function checks the tentative address, detects Duplicate Address Detection (DAD) failure, and verifies the default route. + * If DAD fails, it also triggers a Router Solicitation. + * + * @param p_VirtIf Pointer to the virtual interface structure. + * @return int 0 on success, negative value on failure. */ -static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) +static int checkIpv6AddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) { char buffer[BUFLEN_256] = {0}; - FILE *fp_dad = NULL; - FILE *fp_route = NULL; + FILE *fp_dad = NULL; + FILE *fp_route = NULL; int dad_flag = 0; int route_flag = 0; - int i; - char Output[BUFLEN_16] = {0}; - char IfaceName[BUFLEN_16] = {0}; - int BridgeMode = 0; - - /*TODO: - *Below Code should be removed once V6 Prefix/IP is assigned on erouter0 Instead of brlan0 for sky Devices. - */ - strncpy(IfaceName, ETH_BRIDGE_NAME, sizeof(IfaceName)-1); - sysevent_get(sysevent_fd, sysevent_token, "bridge_mode", Output, sizeof(Output)); - BridgeMode = atoi(Output); - if (BridgeMode != 0) - { - memset(IfaceName, 0, sizeof(IfaceName)); - strncpy(IfaceName, p_VirtIf->Name, sizeof(IfaceName)-1); - } - CcspTraceInfo(("%s-%d: IfaceName=%s, BridgeMode=%d \n", __FUNCTION__, __LINE__, IfaceName, BridgeMode)); + /* Check Duplicate Address Detection (DAD) status. The way it works is that after an address is added to an interface, the operating system uses the + Neighbor Discovery Protocol to check if any other host on the network has the same address. The whole process will take around 3 to 4 seconds + to complete. Also we need to check and ensure that the gateway has a valid default route entry. + */ + // Note: This check is not strictly necessary and this check could delay the WAN up by 15 seconds in worst case. If the IPv6 address (IANA) is obtained via DHCPv6, and the DHCP client already performs the DAD check. + // However, it is beneficial to verify that the WAN IPv6 address is auto-calculated from the delegated prefix or via SLAAC. - /* TODO: the below code assumes if the LAN ipv6 address is tentaive for 15 seconds DAD has failed. Do we need additional check? - * IANA dad is handled in the DHCPv6 client for the Wan Interface. - * Should we remove the IP from LAN bridge and request a different Delegated prefix? - * Should we use EUI-64 based Interface identifiers for all platforms? - */ - - for(i=0; i<15; i++) + for(int i=0; i<15; i++) { buffer[0] = '\0'; if(dad_flag == 0) { - if ((fp_dad = v_secure_popen("r","ip address show dev %s tentative", IfaceName))) + if ((fp_dad = v_secure_popen("r","ip address show dev %s tentative", p_VirtIf->Name))) { if(fp_dad != NULL) { @@ -1004,7 +990,6 @@ static int checkIpv6LanAddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) } } } - if(dad_flag == 0) { sleep(1); @@ -3269,7 +3254,7 @@ static eWanState_t wan_state_obtaining_ip_addresses(WanMgr_IfaceSM_Controller_t* p_VirtIf->IP.Ipv6Changed = FALSE; return WAN_STATE_OBTAINING_IP_ADDRESSES; } - if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) + if (checkIpv6AddressIsReadyToUse(p_VirtIf) == RETURN_OK) { return wan_transition_ipv6_up(pWanIfaceCtrl); } @@ -3340,7 +3325,7 @@ static eWanState_t wan_state_standby(WanMgr_IfaceSM_Controller_t* pWanIfaceCtrl) } p_VirtIf->IP.Ipv6Changed = FALSE; } - if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) + if (checkIpv6AddressIsReadyToUse(p_VirtIf) == RETURN_OK) { ret = wan_transition_ipv6_up(pWanIfaceCtrl); CcspTraceInfo((" %s %d - IPv6 Address Assigned to Bridge Yet.\n", __FUNCTION__, __LINE__)); @@ -3443,7 +3428,7 @@ static eWanState_t wan_state_ipv4_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC p_VirtIf->IP.Ipv6Changed = FALSE; return WAN_STATE_IPV4_LEASED; } - if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) + if (checkIpv6AddressIsReadyToUse(p_VirtIf) == RETURN_OK) { return wan_transition_ipv6_up(pWanIfaceCtrl); } @@ -3554,7 +3539,7 @@ static eWanState_t wan_state_ipv6_leased(WanMgr_IfaceSM_Controller_t* pWanIfaceC pInterface->Selection.Status == WAN_IFACE_ACTIVE && p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) { - if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration + if (checkIpv6AddressIsReadyToUse(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); } @@ -3680,7 +3665,7 @@ static eWanState_t wan_state_dual_stack_active(WanMgr_IfaceSM_Controller_t* pWan pInterface->Selection.Status == WAN_IFACE_ACTIVE && p_VirtIf->MAP.MaptStatus == WAN_IFACE_MAPT_STATE_UP) { - if (checkIpv6LanAddressIsReadyToUse(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration + if (checkIpv6AddressIsReadyToUse(p_VirtIf) == RETURN_OK) // Wait for default gateway before MAP-T configuration { return wan_transition_mapt_up(pWanIfaceCtrl); } From 414fd9d8eaba5dcf0fb00771ea7bf56a373d4d1f Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 7 Feb 2025 14:47:01 +0000 Subject: [PATCH 55/64] Fixing SYSEVENT_IPV6_TOGGLE get Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 4 ++-- source/WanManager/wanmgr_sysevents.c | 32 +++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 2344ca06..53a331bd 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1011,10 +1011,10 @@ static int checkIpv6AddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) } } - //if DAD failed on LAN bridge, log an ERROR message and continue with the WAN process. + //if DAD failed on WAN interface, log an ERROR message and continue with the WAN process. if(dad_flag == 0 || route_flag == 0) { - CcspTraceError(("%s %d dad_flag[%d] route_flag[%d] Failed \n", __FUNCTION__, __LINE__,dad_flag,route_flag)); + CcspTraceError(("%s %d dad_flag[%s] route_flag[%s] Failed \n", __FUNCTION__, __LINE__,dad_flag ?"SUCCESS":"FAILED",route_flag?"SUCCESS":"FAILED")); } if(route_flag == 0) diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index 4da15e89..0d75e692 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -67,6 +67,7 @@ extern int WanMgr_TriggerPrimaryDnsConnectivityRestart(void); #endif #endif +static int isDefaultGatewayAdded = 0; static int lan_wan_started = 0; static int ipv4_connection_up = 0; static int ipv6_connection_up = 0; @@ -578,6 +579,7 @@ static void *WanManagerSyseventHandler(void *args) async_id_t wanamangr_status_asyncid; async_id_t lan_ula_address_event_asyncid; + async_id_t default_route_change_event_asyncid; async_id_t lan_ula_enable_asyncid; async_id_t lan_ipv6_enable_asyncid; async_id_t wan_status_asyncid; @@ -611,6 +613,8 @@ static void *WanManagerSyseventHandler(void *args) async_id_t primary_v6ipaddress_asyncid; #endif #endif + sysevent_set_options(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_IPV6_TOGGLE, TUPLE_FLAG_EVENT); + sysevent_setnotification(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_IPV6_TOGGLE, &default_route_change_event_asyncid); #if defined (_HUB4_PRODUCT_REQ_) || defined(_RDKB_GLOBAL_PRODUCT_REQ_) sysevent_set_options(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_ULA_ADDRESS, TUPLE_FLAG_EVENT); @@ -740,6 +744,19 @@ static void *WanManagerSyseventHandler(void *args) } #endif } + else if ( strcmp(name, SYSEVENT_IPV6_TOGGLE) == 0 ) + { + if(strcmp(val, "FALSE") == 0) + { + isDefaultGatewayAdded = 1; + CcspTraceWarning(("%s %d Netmonitor Update : IPv6 default route Added \n", __FUNCTION__, __LINE__ )); + } + else + { + isDefaultGatewayAdded = 0; + CcspTraceWarning(("%s %d Netmonitor Update : IPv6 default route Deleted \n", __FUNCTION__, __LINE__ )); + } + } else if ( strcmp(name, SYSEVENT_ULA_ENABLE) == 0 ) { #if defined (_HUB4_PRODUCT_REQ_) || defined(_RDKB_GLOBAL_PRODUCT_REQ_) @@ -1173,10 +1190,9 @@ int Force_IPv6_toggle (char* wanInterface) if (sysctl_iface_set("/proc/sys/net/ipv6/conf/%s/disable_ipv6", wanInterface, "0") != 0) { CcspTraceWarning(("%s-%d : Failure writing to /proc file\n", __FUNCTION__, __LINE__)); - } - - sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); //Reset toggle flag to false. + } + isDefaultGatewayAdded = 1; //Reset isDefaultGatewayAdded flag; return ret; } @@ -1187,17 +1203,13 @@ int Force_IPv6_toggle (char* wanInterface) */ void WanMgr_CheckDefaultRA (DML_VIRTUAL_IFACE * pVirtIf) { - char v6Toggle[BUFLEN_128] = {0}; - //TODO : Move router monitor to a WanManager thread ? to avoid continous sysevent get - sysevent_get(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, v6Toggle, sizeof(v6Toggle)); - - if((strlen(v6Toggle) == 0) || (!strcmp(v6Toggle,"TRUE"))) + //TODO : Move router monitor to a WanManager thread ? + if(!isDefaultGatewayAdded ) { - CcspTraceInfo(("%s %d SYSEVENT_IPV6_TOGGLE[TRUE] \n", __FUNCTION__, __LINE__)); //TODO: add check for remote device ( static ip ) if (CheckV6DefaultRule(pVirtIf->Name) == TRUE || WanManager_send_and_receive_rs(pVirtIf) == 0) { - sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_IPV6_TOGGLE, "FALSE", 0); + isDefaultGatewayAdded = 1; //Reset isDefaultGatewayAdded flag; } } } From b7c30de22d70c5be941fe5a58a7d2b584c874a01 Mon Sep 17 00:00:00 2001 From: S-Parthiban-Selvaraj Date: Fri, 7 Feb 2025 14:57:49 +0000 Subject: [PATCH 56/64] FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE compilation issue Signed-off-by: S-Parthiban-Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 2dad1b5e..0df849c2 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -53,10 +53,8 @@ extern char g_Subsystem[32]; #endif #endif -#if defined(FEATURE_RDKB_CONFIGURABLE_WAN_INTERFACE) #define COSA_DML_WANIface_ADDR_SYSEVENT_NAME "tr_%s_dhcpv6_client_v6addr" char PreviousIPv6Address[128] = {0}; //Global varibale to store previous IPv6 address -#endif static struct { pthread_t dhcpv6c_thread; From 42bf6eaa35b5cb8e9744e119c49be12207215227 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Mon, 14 Jul 2025 16:12:33 +0100 Subject: [PATCH 57/64] Fixing Ipv6 addr delete Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_interface_sm.c | 4 +++- source/WanManager/wanmgr_net_utils.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 3ddcec24..6a47f7e3 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -2564,7 +2564,6 @@ static eWanState_t wan_transition_ipv6_down(WanMgr_IfaceSM_Controller_t* pWanIfa WanMgr_Rbus_EventPublishHandler(param_name, "", RBUS_STRING); snprintf(param_name, sizeof(param_name), "Device.X_RDK_WanManager.Interface.%d.VirtualInterface.%d.IP.IPv6Prefix", p_VirtIf->baseIfIdx+1, p_VirtIf->VirIfIdx+1); WanMgr_Rbus_EventPublishHandler(param_name, "", RBUS_STRING); - WanManager_UpdateInterfaceStatus (p_VirtIf, WANMGR_IFACE_CONNECTION_IPV6_DOWN); if(p_VirtIf->Status == WAN_IFACE_STATUS_UP) { @@ -2573,6 +2572,9 @@ static eWanState_t wan_transition_ipv6_down(WanMgr_IfaceSM_Controller_t* pWanIfa CcspTraceError(("%s %d - Failed to tear down IPv6 for %s \n", __FUNCTION__, __LINE__, p_VirtIf->Name)); } } + + WanManager_UpdateInterfaceStatus (p_VirtIf, WANMGR_IFACE_CONNECTION_IPV6_DOWN); + #if defined(FEATURE_464XLAT) xlat_status = xlat_state_get(); if(xlat_status == XLAT_ON) diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 8eed42f6..c1f757a3 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -343,7 +343,7 @@ int WanManager_Ipv6AddrUtil(DML_VIRTUAL_IFACE* p_VirtIf,Ipv6OperType opr) if (strlen( p_VirtIf->IP.Ipv6Data.address) > 0) { memset(cmdLine, 0, sizeof(cmdLine)); - snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr del %s/64 dev %s", p_VirtIf->IP.Ipv6Data.address, p_VirtIf->Name); + snprintf(cmdLine, sizeof(cmdLine), "ip -6 addr del %s/128 dev %s", p_VirtIf->IP.Ipv6Data.address, p_VirtIf->Name); if (WanManager_DoSystemActionWithStatus("ip -6 addr del ADDR dev xxxx", cmdLine) != 0) CcspTraceError(("failed to run cmd: %s", cmdLine)); From e0d878956bd6cd416a1220f556b97a8126f6c2c7 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Wed, 16 Jul 2025 16:35:37 +0100 Subject: [PATCH 58/64] Fixing ipv6 lease refresh case Signed-off-by: Parthiban Selvaraj --- source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c | 9 +++++++-- source/WanManager/wanmgr_dhcpv6_apis.c | 2 +- source/WanManager/wanmgr_interface_sm.c | 9 +++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c index 957b17f0..e527b2a1 100644 --- a/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c +++ b/source/WanManager/DHCPv6cMsgHandler/dhcpv6c_msg_apis.c @@ -672,14 +672,19 @@ static void * WanMgr_DhcpV6MsgHandler() CcspTraceInfo(("%s %d Prefix Assigned\n", __FUNCTION__, __LINE__)); snprintf(dhcpv6_data.sitePrefix, sizeof(dhcpv6_data.sitePrefix), "%s/%d", v6pref, pref_len); - dhcpv6_data.prefixAssigned = TRUE; strncpy(dhcpv6_data.pdIfAddress, "", sizeof(dhcpv6_data.pdIfAddress)); dhcpv6_data.prefixCmd = 0; remove_single_quote(iapd_pretm); remove_single_quote(iapd_vldtm); sscanf(iapd_pretm, "%d", &(dhcpv6_data.prefixPltime)); sscanf(iapd_vldtm, "%d", &(dhcpv6_data.prefixVltime)); - + // Set prefixAssigned to TRUE only if both preferred and valid lifetimes are positive + if (dhcpv6_data.prefixPltime > 0 && dhcpv6_data.prefixVltime > 0) + { + dhcpv6_data.prefixAssigned = TRUE; + } else { + dhcpv6_data.prefixAssigned = FALSE; + } //IPv6 prefix related sysevents // Define the eventMaps array as before Ipv6SyseventMap eventMaps[] = { diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index f951e6ca..faf7b868 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1748,7 +1748,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) pNewIpcMsg->addrAssigned = true; Ipv6DataNew.addrCmd = pDhcp6cInfoCur->addrCmd; } - else + else if(Ipv6DataNew.prefixAssigned) { /* In an IPv6 lease, if only IAPD is received and we never received IANA, * We can use the received IAPD to construct a Ipv6 /128 address which can be used for managerment and voice ... diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index 6a47f7e3..430e0b4b 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -2574,6 +2574,15 @@ static eWanState_t wan_transition_ipv6_down(WanMgr_IfaceSM_Controller_t* pWanIfa } WanManager_UpdateInterfaceStatus (p_VirtIf, WANMGR_IFACE_CONNECTION_IPV6_DOWN); + //clear IPv6 lease from the interface data + memset(&(p_VirtIf->IP.Ipv6Data), 0, sizeof(WANMGR_IPV6_DATA)); + if (p_VirtIf->IP.pIpcIpv6Data != NULL ) + { + //free memory + free(p_VirtIf->IP.pIpcIpv6Data); + p_VirtIf->IP.pIpcIpv6Data = NULL; + } + #if defined(FEATURE_464XLAT) xlat_status = xlat_state_get(); From c1adbfb83a875e5c537890a3a48fc10066c24209 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Wed, 23 Jul 2025 11:41:24 +0100 Subject: [PATCH 59/64] DHCPManager support Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcp_event_handler.c | 11 +++++++++ source/WanManager/wanmgr_dhcpv6_apis.c | 6 ++--- source/WanManager/wanmgr_dhcpv6_apis.h | 24 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/source/WanManager/wanmgr_dhcp_event_handler.c b/source/WanManager/wanmgr_dhcp_event_handler.c index 92f4e3c9..0e4898d2 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -97,6 +97,17 @@ static void copyDhcpv6Data(WANMGR_IPV6_DATA* pDhcpv6Data, const DHCP_MGR_IPV6_MS pDhcpv6Data->prefixAssigned = leaseInfo->prefixAssigned; pDhcpv6Data->domainNameAssigned = leaseInfo->domainNameAssigned; pDhcpv6Data->ipv6_TimeOffset = leaseInfo->ipv6_TimeOffset; + if(!pDhcpv6Data->addrAssigned && !pDhcpv6Data->prefixAssigned) + { + /* In an IPv6 lease, if only IAPD is received and we never received IANA, + * We can use the received IAPD to construct a Ipv6 /128 address which can be used for managerment and voice ... + * If we reach this point, only IAPD has been received. Canculate Wan Ipv6 address + */ + + CcspTraceInfo(("IANA is not assigned by DHCPV6. Constructing WAN address from the IAPD for Wan Interface \n")); + wanmgr_construct_wan_address_from_IAPD(pDhcpv6Data); + } + } pthread_mutex_t DhcpClientEvents_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index faf7b868..f5c1b2df 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1602,7 +1602,7 @@ static int WanMgr_CopyPreviousPrefix(WANMGR_IPV6_DATA* pOld, WANMGR_IPV6_DATA* p * - WAN IPv6 Address: "2a06:5906:13:d001::1/128" */ #define WAN_SUFFIX 1 -static int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) +int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) { int prefix_length; char iapd_prefix[128] = {0}; @@ -1652,6 +1652,8 @@ static int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew inet_ntop(AF_INET6, &prefix, pIpv6DataNew->address, sizeof(pIpv6DataNew->address)); } + pIpv6DataNew->addrAssigned = true; + pIpv6DataNew->addrCmd = IFADDRCONF_ADD; CcspTraceInfo(("%s %d Calculated WAN network IP %s/128 \n", __FUNCTION__, __LINE__, pIpv6DataNew->address)); //Since this address calculated by us, it will be assigned by the DHCPv6c client. Assign the address on the Wan interface @@ -1757,9 +1759,7 @@ ANSC_STATUS wanmgr_handle_dhcpv6_event_data(DML_VIRTUAL_IFACE * pVirtIf) CcspTraceInfo(("IANA is not assigned by DHCPV6. Constructing WAN address from the IAPD for Wan Interface \n")); wanmgr_construct_wan_address_from_IAPD(&Ipv6DataNew); - Ipv6DataNew.addrAssigned = true; pNewIpcMsg->addrAssigned = true; - Ipv6DataNew.addrCmd = pDhcp6cInfoCur->addrCmd; } diff --git a/source/WanManager/wanmgr_dhcpv6_apis.h b/source/WanManager/wanmgr_dhcpv6_apis.h index 1f038f55..52ede8f1 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.h +++ b/source/WanManager/wanmgr_dhcpv6_apis.h @@ -344,4 +344,28 @@ void _get_shell_output(FILE *fp, char * out, int len); ************************************************************************************/ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf); +/** + * @brief Constructs a dedicated WAN IPv6 address from the received IAPD (IA Prefix Delegation). + * + * This function extracts the IPv6 prefix and its length from the given IAPD data. It then uses + * the provided prefix to construct a unique WAN IPv6 address by using the next available /64 subnet. + * The first /64 subnet of the IAPD is reserved for LAN, while the next /64 is used for the WAN address. + * The constructed WAN address is assigned to the specified WAN interface. + * + * @param[in] pIpv6DataNew Pointer to the WANMGR_IPV6_DATA structure. + * + * @return + * - 0 on success. + * - -1 on failure (e.g., invalid prefix format, prefix length >= 64, or system command failure). + * + * @note The function assumes that if the prefix length is less than 64, there are sufficient bits available + * to split the IAPD into multiple /64 subnets. If the prefix length is 64 or greater, it logs an error + * and returns -1 since further subnetting is not possible. + * + * ### Example: + * Given an IAPD of "2a06:5906:13:d000::/56", the function may construct the following addresses: + * - LAN IPv6 Address Range: "2a06:5906:13:d000::/64" + * - WAN IPv6 Address: "2a06:5906:13:d001::1/128" + */ +int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew); #endif //_WANMGR_DHCPV6_APIS_H_ From 1b44dc1b23b12a8fd6658b1c39f177075cac2605 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj <167313466+S-Parthiban-Selvaraj@users.noreply.github.com> Date: Thu, 18 Sep 2025 14:25:07 +0100 Subject: [PATCH 60/64] Update wanmgr_dhcp_event_handler.c --- source/WanManager/wanmgr_dhcp_event_handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcp_event_handler.c b/source/WanManager/wanmgr_dhcp_event_handler.c index 0a96017a..3d63b39d 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -199,7 +199,7 @@ void* WanMgr_DhcpClientEventsHandler_Thread(void *arg) //TODO: Check for sysevents if(pVirtIf->IP.Ipv6Data.prefixAssigned == TRUE) { - WanManager_Ipv6PrefixUtil(pVirtIf->Name, SET_LFT, pVirtIf->IP.Ipv6Data.prefixPltime, pVirtIf->IP.Ipv6Data.prefixVltime); + WanManager_Ipv6AddrUtil(pVirtIf, SET_LFT); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_RADVD_RESTART, NULL, 0); } CcspTraceInfo(("%s-%d : DHCPv6 lease renewed for %s\n", __FUNCTION__, __LINE__, pVirtIf->Name)); From ed6da65198a668f040f9d080d1f185c558f835a7 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj Date: Fri, 16 Jan 2026 13:58:47 +0000 Subject: [PATCH 61/64] Fixing the SYSCFG_FIELD_IPV6_PREFIX_ADDRESS syscfg Signed-off-by: Parthiban Selvaraj --- source/WanManager/wanmgr_dhcpv6_apis.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index 72763d5a..8d68f49f 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -2143,8 +2143,12 @@ int setUpLanPrefixIPv6(DML_VIRTUAL_IFACE* pVirtIf) int index = strcspn(pVirtIf->IP.Ipv6Data.sitePrefix, "/"); if (index < strlen(pVirtIf->IP.Ipv6Data.sitePrefix) && index < sizeof(prefix)) { - strncpy(prefix, pVirtIf->IP.Ipv6Data.sitePrefix, index); // only copy prefix without the prefix length - syscfg_set_string(SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, pVirtIf->IP.Ipv6Data.address); + strncpy(prefix, pVirtIf->IP.Ipv6Data.sitePrefix, index); // only copy prefix without the prefix length + // Create and set IPv6 address with /128 prefix length //TODO: SYSCFG_FIELD_IPV6_PREFIX_ADDRESS may not be used anymore. Check and remove if not used in the NTP script + char ipv6_addr_with_prefix[BUFLEN_64] = {0}; + snprintf(ipv6_addr_with_prefix, sizeof(ipv6_addr_with_prefix), "%s/128", pVirtIf->IP.Ipv6Data.address); + syscfg_set_string(SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, ipv6_addr_with_prefix); + CcspTraceInfo(("%s %d IPv6 address syscfg %s set to %s\n", __FUNCTION__, __LINE__, SYSCFG_FIELD_IPV6_PREFIX_ADDRESS, ipv6_addr_with_prefix)); CcspTraceInfo(("%s %d new prefix = %s\n", __FUNCTION__, __LINE__, pVirtIf->IP.Ipv6Data.sitePrefix)); strncat(prefix, "/64",sizeof(prefix)-1); sysevent_set(sysevent_fd, sysevent_token, SYSEVENT_FIELD_IPV6_PREFIX, prefix, 0); From e81e35e5715c3ff1fedef9b3f07475d0910cfab6 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj <167313466+S-Parthiban-Selvaraj@users.noreply.github.com> Date: Tue, 20 Jan 2026 11:15:24 +0000 Subject: [PATCH 62/64] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- source/WanManager/wanmgr_sysevents.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/WanManager/wanmgr_sysevents.c b/source/WanManager/wanmgr_sysevents.c index c6a40d41..df04f664 100644 --- a/source/WanManager/wanmgr_sysevents.c +++ b/source/WanManager/wanmgr_sysevents.c @@ -620,8 +620,7 @@ static void *WanManagerSyseventHandler(void *args) sysevent_set_options(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_IPV6_TOGGLE, TUPLE_FLAG_EVENT); sysevent_setnotification(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_IPV6_TOGGLE, &default_route_change_event_asyncid); - sysevent_set_options(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_IPV6_TOGGLE, TUPLE_FLAG_EVENT); - sysevent_setnotification(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_IPV6_TOGGLE, &default_route_change_event_asyncid); + #if defined (_HUB4_PRODUCT_REQ_) || defined(_RDKB_GLOBAL_PRODUCT_REQ_) sysevent_set_options(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_ULA_ADDRESS, TUPLE_FLAG_EVENT); sysevent_setnotification(sysevent_msg_fd, sysevent_msg_token, SYSEVENT_ULA_ADDRESS, &lan_ula_address_event_asyncid); From 5079060b0fc7a08e793b573d38ef3c95ca873df2 Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj <167313466+S-Parthiban-Selvaraj@users.noreply.github.com> Date: Tue, 20 Jan 2026 11:30:02 +0000 Subject: [PATCH 63/64] Fix condition check for handling IAPD in IPv6 lease processing --- source/WanManager/wanmgr_dhcp_event_handler.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/WanManager/wanmgr_dhcp_event_handler.c b/source/WanManager/wanmgr_dhcp_event_handler.c index 3d63b39d..63f88c16 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -103,7 +103,7 @@ static void copyDhcpv6Data(WANMGR_IPV6_DATA* pDhcpv6Data, const DHCP_MGR_IPV6_MS pDhcpv6Data->prefixAssigned = leaseInfo->prefixAssigned; pDhcpv6Data->domainNameAssigned = leaseInfo->domainNameAssigned; pDhcpv6Data->ipv6_TimeOffset = leaseInfo->ipv6_TimeOffset; - if(!pDhcpv6Data->addrAssigned && !pDhcpv6Data->prefixAssigned) + if(!pDhcpv6Data->addrAssigned && pDhcpv6Data->prefixAssigned) { /* In an IPv6 lease, if only IAPD is received and we never received IANA, * We can use the received IAPD to construct a Ipv6 /128 address which can be used for managerment and voice ... From 2754e4d9220358d04aaa7a78cd09c8c3b095b14c Mon Sep 17 00:00:00 2001 From: Parthiban Selvaraj <167313466+S-Parthiban-Selvaraj@users.noreply.github.com> Date: Mon, 23 Feb 2026 13:18:37 +0000 Subject: [PATCH 64/64] Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- source/WanManager/wanmgr_dhcp_event_handler.c | 2 +- source/WanManager/wanmgr_dhcpv6_apis.c | 2 +- source/WanManager/wanmgr_interface_sm.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/source/WanManager/wanmgr_dhcp_event_handler.c b/source/WanManager/wanmgr_dhcp_event_handler.c index cfb5d604..3d02c6c8 100644 --- a/source/WanManager/wanmgr_dhcp_event_handler.c +++ b/source/WanManager/wanmgr_dhcp_event_handler.c @@ -108,7 +108,7 @@ static void copyDhcpv6Data(WANMGR_IPV6_DATA* pDhcpv6Data, const DHCP_MGR_IPV6_MS { /* In an IPv6 lease, if only IAPD is received and we never received IANA, * We can use the received IAPD to construct a Ipv6 /128 address which can be used for managerment and voice ... - * If we reach this point, only IAPD has been received. Canculate Wan Ipv6 address + * If we reach this point, only IAPD has been received. Calculate Wan Ipv6 address */ CcspTraceInfo(("IANA is not assigned by DHCPV6. Constructing WAN address from the IAPD for Wan Interface \n")); diff --git a/source/WanManager/wanmgr_dhcpv6_apis.c b/source/WanManager/wanmgr_dhcpv6_apis.c index a2efa78a..dd0846bb 100644 --- a/source/WanManager/wanmgr_dhcpv6_apis.c +++ b/source/WanManager/wanmgr_dhcpv6_apis.c @@ -1622,7 +1622,7 @@ int wanmgr_construct_wan_address_from_IAPD(WANMGR_IPV6_DATA *pIpv6DataNew) // Convert prefix to binary format if (inet_pton(AF_INET6, iapd_prefix, &prefix) != 1) { - fprintf(stderr, "Invalid IPv6 prefix\n"); + CcspTraceError(("%s %d Failed to convert prefix to in6_addr\n", __FUNCTION__, __LINE__)); return -1; } diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index ca5b6321..cd1367f5 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -1101,7 +1101,7 @@ static int checkIpv6AddressIsReadyToUse(DML_VIRTUAL_IFACE* p_VirtIf) //if DAD failed on WAN interface, log an ERROR message and continue with the WAN process. if(dad_flag == 0 || route_flag == 0) { - CcspTraceError(("%s %d dad_flag[%s] route_flag[%s] Failed \n", __FUNCTION__, __LINE__,dad_flag ?"SUCCESS":"FAILED",route_flag?"SUCCESS":"FAILED")); + CcspTraceError(("%s %d dad_flag[%s] route_flag[%s] Failed \n", __FUNCTION__, __LINE__, dad_flag ? "SUCCESS" : "FAILED", route_flag ? "SUCCESS" : "FAILED")); } if(route_flag == 0)