diff --git a/source/TR-181/middle_layer_src/wanmgr_rbus_dhcp_client_events.c b/source/TR-181/middle_layer_src/wanmgr_rbus_dhcp_client_events.c index 7bb653be..5f90b83d 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rbus_dhcp_client_events.c +++ b/source/TR-181/middle_layer_src/wanmgr_rbus_dhcp_client_events.c @@ -132,25 +132,86 @@ static void WanMgr_DhcpClientEventsHandler(rbusHandle_t handle, rbusEvent_t cons CcspTraceError(("%s : FAILED , value is NULL\n",__FUNCTION__)); return; } - - //CcspTraceInfo(("%s %d: Received %s\n", __FUNCTION__, __LINE__, eventName)); + + CcspTraceInfo(("%s %d: Received %s\n", __FUNCTION__, __LINE__, eventName)); if (strstr(eventName, DHCP_MGR_DHCPv4_TABLE) || strstr(eventName, DHCP_MGR_DHCPv6_TABLE) ) { DhcpEventThreadArgs *eventData = malloc(sizeof(DhcpEventThreadArgs)); + if(eventData == NULL) + { + CcspTraceError(("%s %d: Failed to allocate memory for DHCP event data\n", __FUNCTION__, __LINE__)); + return; + } memset(eventData, 0, sizeof(DhcpEventThreadArgs)); eventData->version = strstr(eventName, DHCP_MGR_DHCPv4_TABLE) ? DHCPV4 : DHCPV6; + + /* Resolve the object that holds IfName/MsgType/LeaseInfo. + * RBUS wraps the payload under "initialValue" for subscribe-GET + * responses; fall back to "value" for other auto-publish shapes. */ + rbusObject_t dataObj = event->data; + rbusValue_t wrappedVal = rbusObject_GetValue(event->data, "initialValue"); + if ((wrappedVal != NULL) && (rbusValue_GetType(wrappedVal) == RBUS_OBJECT)) + { + rbusObject_t nestedObj = rbusValue_GetObject(wrappedVal); + if (nestedObj != NULL) + { + dataObj = nestedObj; + CcspTraceInfo(("%s %d: Unwrapped payload from initialValue\n", __FUNCTION__, __LINE__)); + } + } + else + { + wrappedVal = rbusObject_GetValue(event->data, "value"); + if ((wrappedVal != NULL) && (rbusValue_GetType(wrappedVal) == RBUS_OBJECT)) + { + rbusObject_t nestedObj = rbusValue_GetObject(wrappedVal); + if (nestedObj != NULL) + { + dataObj = nestedObj; + CcspTraceInfo(("%s %d: Unwrapped payload from value\n", __FUNCTION__, __LINE__)); + } + } + } + rbusValue_t value; - value = rbusObject_GetValue(event->data, "IfName"); - strncpy(eventData->ifName , rbusValue_GetString(value, NULL), sizeof(eventData->ifName)-1); + value = rbusObject_GetValue(dataObj, "IfName"); + if(value == NULL) + { + CcspTraceError(("%s %d: Failed to get IfName from event data\n", __FUNCTION__, __LINE__)); + free(eventData); + return; + } + + const char* ifName = rbusValue_GetString(value, NULL); + if (ifName == NULL) + { + CcspTraceError(("%s %d: IfName string is NULL in event data\n", __FUNCTION__, __LINE__)); + free(eventData); + return; + } + + strncpy(eventData->ifName , ifName, sizeof(eventData->ifName)-1); CcspTraceInfo(("%s-%d : DHCP client event %s received for %s\n", __FUNCTION__, __LINE__, eventName, eventData->ifName)); - value = rbusObject_GetValue(event->data, "MsgType"); + value = rbusObject_GetValue(dataObj, "MsgType"); + if(value == NULL) + { + CcspTraceError(("%s %d: Failed to get MsgType from event data\n", __FUNCTION__, __LINE__)); + free(eventData); + return; + } eventData->type = rbusValue_GetUInt32(value); if(eventData->type == DHCP_LEASE_UPDATE) { int bytes_len=0; - value = rbusObject_GetValue(event->data, "LeaseInfo"); + value = rbusObject_GetValue(dataObj, "LeaseInfo"); + if(value == NULL) + { + CcspTraceError(("%s %d: Failed to get LeaseInfo from event data\n", __FUNCTION__, __LINE__)); + free(eventData); + return; + } uint8_t const* ptr = rbusValue_GetBytes(value, &bytes_len); if(eventData->version == DHCPV4) { @@ -185,8 +246,11 @@ void WanMgr_SubscribeDhcpClientEvents(const char *DhcpInterface) { rbusError_t rc = RBUS_ERROR_SUCCESS; char eventName[64] = {0}; + snprintf(eventName, sizeof(eventName), "%s.Events", DhcpInterface); - rc = rbusEvent_Subscribe(rbusHandle, eventName, WanMgr_DhcpClientEventsHandler, NULL, 60); + rbusEventSubscription_t subscription = {eventName, NULL, 0, 0, WanMgr_DhcpClientEventsHandler, NULL, NULL, NULL, true}; + + rc = rbusEvent_SubscribeEx(rbusHandle, &subscription, 1, 60); if(rc != RBUS_ERROR_SUCCESS) { CcspTraceError(("%s %d - Failed to Subscribe %s, Error=%s \n", __FUNCTION__, __LINE__, eventName, rbusError_ToString(rc))); diff --git a/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.h b/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.h index d8a3192d..250d74ee 100644 --- a/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.h +++ b/source/TR-181/middle_layer_src/wanmgr_rdkbus_utils.h @@ -141,7 +141,7 @@ extern token_t sysevent_token; #define CMAGENT_COMPONENT_NAME "eRT.com.cisco.spvtg.ccsp.cm" #define CMAGENT_COMP_NAME_WITHOUTSUBSYSTEM "com.cisco.spvtg.ccsp.cm" #define CMAGENT_COMPONENT_PATH "/com/cisco/spvtg/ccsp/cm" -#define CMAGENT_PHY_STATUS_DM_SUFFIX "CMStatus" +#define CMAGENT_PHY_STATUS_DM_SUFFIX ".CMStatus" //Cellular Manager #define CELLULAR_COMPONENT_NAME "eRT.com.cisco.spvtg.ccsp.cellularmanager" diff --git a/source/WanManager/wanmgr_interface_sm.c b/source/WanManager/wanmgr_interface_sm.c index c2e42a03..dbed8965 100644 --- a/source/WanManager/wanmgr_interface_sm.c +++ b/source/WanManager/wanmgr_interface_sm.c @@ -3961,6 +3961,12 @@ 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 + { + /* IPv6 address not ready yet, stay in standby to retry */ + CcspTraceInfo((" %s %d - IPv6 address not ready, waiting...\n", __FUNCTION__, __LINE__)); + return WAN_STATE_STANDBY; + } } if (p_VirtIf->IP.Ipv4Status == WAN_IFACE_IPV4_STATE_UP) { diff --git a/source/WanManager/wanmgr_net_utils.c b/source/WanManager/wanmgr_net_utils.c index 4ce7cb06..d9d69a5c 100644 --- a/source/WanManager/wanmgr_net_utils.c +++ b/source/WanManager/wanmgr_net_utils.c @@ -347,9 +347,8 @@ int WanManager_Ipv6PrefixUtil(char *ifname, Ipv6OperType opr, int preflft, int v CcspTraceError(("%s-%d: bridge_mode sysevent get failed. \n", __FUNCTION__, __LINE__)); } BridgeMode = atoi(Output); - CcspTraceInfo(("%s-%d: <> bridge_mode sysevent value set to =%d \n", __FUNCTION__, __LINE__, BridgeMode)); + CcspTraceInfo(("%s-%d: bridge_mode sysevent value set to =%d \n", __FUNCTION__, __LINE__, BridgeMode)); } - /*TODO: *Below Code should be removed once V6 Prefix/IP is assigned on erouter0 Instead of brlan0 for sky Devices. */ @@ -515,10 +514,10 @@ int WanManager_StartDhcpv6Client(DML_VIRTUAL_IFACE* pVirtIf, IFACE_TYPE IfaceTyp #if defined( FEATURE_RDKB_DHCP_MANAGER ) char dmlName[256] = {0}; - WanMgr_SubscribeDhcpClientEvents(pVirtIf->IP.DHCPv6Iface); snprintf( dmlName, sizeof(dmlName), "%s.Interface", pVirtIf->IP.DHCPv6Iface ); WanMgr_RdkBus_SetParamValues(DHCPMGR_COMPONENT_NAME, DHCPMGR_DBUS_PATH, dmlName, pVirtIf->Name, ccsp_string, TRUE); memset(dmlName, 0, sizeof(dmlName)); + WanMgr_SubscribeDhcpClientEvents(pVirtIf->IP.DHCPv6Iface); snprintf( dmlName, sizeof(dmlName), "%s.Enable", pVirtIf->IP.DHCPv6Iface ); @@ -634,10 +633,10 @@ int WanManager_StartDhcpv4Client(DML_VIRTUAL_IFACE* pVirtIf, char* baseInterface } #if defined( FEATURE_RDKB_DHCP_MANAGER ) char dmlName[256] = {0}; - WanMgr_SubscribeDhcpClientEvents(pVirtIf->IP.DHCPv4Iface); snprintf( dmlName, sizeof(dmlName), "%s.Interface", pVirtIf->IP.DHCPv4Iface ); WanMgr_RdkBus_SetParamValues(DHCPMGR_COMPONENT_NAME, DHCPMGR_DBUS_PATH, dmlName, pVirtIf->Name, ccsp_string, TRUE); memset(dmlName, 0, sizeof(dmlName)); + WanMgr_SubscribeDhcpClientEvents(pVirtIf->IP.DHCPv4Iface); snprintf( dmlName, sizeof(dmlName), "%s.Enable", pVirtIf->IP.DHCPv4Iface ); if (ANSC_STATUS_SUCCESS == WanMgr_RdkBus_SetParamValues(DHCPMGR_COMPONENT_NAME, DHCPMGR_DBUS_PATH, dmlName, "true", ccsp_boolean, TRUE)) {