32 #define SSU_GROUP_LIST 0
33 #define NUM_LISTS_SSU_GROUPS 1
39 typedef struct s_GroupInfo *P_GroupInfo;
40 typedef struct s_GroupInfoItem *P_GroupInfoItem;
42 typedef struct s_GroupInfo
50 U16BIT associationTag;
54 typedef struct s_GroupInfoItem
82 pGII = (P_GroupInfoItem)DSC_CmMemGet( idp,
sizeof(S_GroupInfoItem) );
85 err = CLDSM_ERR_MEM_HEAP_FULL;
89 llLinkInit( pGII->llData, NUM_LISTS_SSU_GROUPS );
90 pGII->group = *pGroup;
92 tap.transactionId = pGroup->id;
93 tap.associationTag = pGroup->associationTag;
94 tap.timeout = 0xFFFFFFFF;
95 err = DSC_DataCrslCreate( idp, &pUC->root, &tap, &pDC );
98 err = LLCreate( idp, pDC, MODULE_LOAD_REQUEST_LIST, &pDC->llcLoadRequests );
101 err = DSC_LoadRsqtCreate( idp,
sizeof(
S_RootLoadRqst), TT_SSU_GROUP, pGII,
102 (F_LoadFinalise)CarouselLoadFinalise, &pLoadRqst );
105 LLInsertHead( pDC->llcLoadRequests, pLoadRqst );
106 err = DSC_DataCrslAcquireStart( idp, pDC, SF_PRIORITY_HIGH );
109 LLInsertTail( pUC->llcGroups, pGII );
113 LLDestroy( idp, &pDC->llcLoadRequests );
114 DSC_LoadRsqtDestroy( idp, pLoadRqst );
119 LLDestroy( idp, &pDC->llcLoadRequests );
124 DSC_DataCrslDestroy( idp, pDC );
129 DSC_CmMemRelease( idp, pGII );
138 P_GroupInfoItem item;
139 item = LLRemoveTail( llcGroups );
142 ERRPRINT(
"release=%p", item)
143 DSC_CmMemRelease(idp, item);
144 item = LLRemoveTail( llcGroups );
167 dsmAssert((idp != NULL));
168 dsmAssert((ppUC != NULL));
173 err = CLDSM_ERR_MEM_HEAP_FULL;
179 err = DSC_RootCrslInitialise( idp, &pUC->root, UC_MAGIC, serviceId, oui );
182 DSC_CmMemRelease(idp, pUC);
187 err = LLCreate( idp, pUC, SSU_GROUP_LIST, &pUC->llcGroups );
190 pUC->llcGroups = NULL;
191 DSC_RootCrslFinalise( idp, &pUC->root );
192 DSC_CmMemRelease(idp, pUC);
197 err = DSC_LoadRsqtCreate( idp,
sizeof(
S_RootLoadRqst), TT_CAROUSEL, pUC,
198 CarouselLoadFinalise, &pLoadRqst );
201 LLDestroy( idp, &(pUC->llcGroups));
202 DSC_RootCrslFinalise( idp, &pUC->root );
203 DSC_CmMemRelease(idp, pUC);
208 pUC->root.pLoadRqst = pLoadRqst;
214 DEBUG_CHK( err == CLDSM_OK, ERRPRINT(
"Error %u", err));
225 dsmAssert((idp != NULL));
226 dsmAssert((pUC != NULL));
229 if (LLCount( pUC->llcGroups ))
231 UnloadGroups( idp, pUC->llcGroups );
234 LLDestroy( idp, &(pUC->llcGroups));
236 DSC_RootCrslFinalise( idp, &pUC->root );
239 DSC_CmMemRelease( idp, pUC );
242 static void ParseGroupInfoDescriptors( MemPtr pData, U16BIT length, S_GroupInfo *pGroup )
244 MemPos currPos, endPos;
249 GET_POS( pData, currPos );
250 endPos = currPos + length;
251 while (currPos < endPos)
253 READ_UINT8( pData, dtag );
254 READ_UINT8( pData, dlen );
257 case DESCRIPTOR_TYPE_TAG:
261 case DESCRIPTOR_NAME_TAG:
265 case DESCRIPTOR_INFO_TAG:
269 case DESCRIPTOR_LOCATION_TAG:
271 READ_UINT8( pData, ui8 );
272 pGroup->associationTag = ui8;
275 case DESCRIPTOR_GROUP_LINK_TAG:
277 READ_UINT8( pData, ui8 );
278 READ_UINT32( pData, pGroup->nextGroupId );
279 pGroup->positionType = ui8 + 1;
282 case DESCRIPTOR_SSU_SUBGROUP_ASS_TAG:
284 READ_UINT32( pData, pGroup->subgroup );
289 DBG2(DD_OC,
"Unknown descriptor tag: %x", dtag);
293 SET_POS_ABS( pData, currPos + 2 + dlen );
294 GET_POS( pData, currPos );
307 U8BIT *pDsiPrivate, U16BIT dsiPrivateLen )
309 E_DscError err = CLDSM_ERR_END_OF_DATA;
312 U16BIT glen, numGroups;
315 dsmAssert((pDsiPrivate != NULL));
317 if (dsiPrivateLen < 2)
319 ERRLOG(DD_OC,
"DATA ERROR: Group short len=%u", dsiPrivateLen )
324 READ_UINT16( pData, numGroups );
325 if (dsiPrivateLen < ((numGroups * 12) + 2))
327 ERRLOG(DD_OC,
"DATA ERROR: Group short len=%u groups=%u", dsiPrivateLen, numGroups )
331 dsmAssert((pUC->root.status == RCS_BOOTING));
332 pUC->root.pLoadRqst->status = LRS_STALLED_SRG_MODULE;
333 pUC->root.status = RCS_BOOTED;
334 DBGLOG(DD_OC,
"numGroups %u", numGroups)
337 memset(&group, 0,
sizeof(S_GroupInfo));
338 group.oui = OUI_SPECIFIER_TYPE | (pUC->root.rcid & OUI_DATA_MASK);
339 group.associationTag = pUC->root.dsiAssocTag;
340 READ_UINT32( pData, group.id );
341 READ_UINT32( pData, group.size );
343 READ_UINT16( pData, glen );
344 pCompat = DSC_UtilParseCompatibilityDesc( idp, pData, glen, group.oui );
345 SET_POS_REL( pData, glen );
347 READ_UINT16( pData, glen );
350 DBGLOG(DD_OC,
"Group(%x) Info length=%d", group.id, glen)
351 ParseGroupInfoDescriptors( pData, glen, &group );
352 SET_POS_REL( pData, glen );
354 READ_UINT16( pData, glen );
357 DBGLOG(DD_OC,
"Group(%x) Private Data length=%d", group.id, glen)
358 SET_POS_REL( pData, glen );
362 ERRLOG(DD_OC,
"fail parsing Compatibility Descriptor")
367 DBGLOG(DD_OC,
"pCompat->sw_num %u", pCompat->sw_num)
368 for (s = 0; s < pCompat->sw_num; s++)
370 group.smv.sw_model = pCompat->swlist[s].model;
371 group.smv.sw_version = pCompat->swlist[s].version;
372 DBGLOG(DD_OC,
"pCompat->hw_num %u", pCompat->hw_num)
373 for (h = 0; h != pCompat->hw_num; h++)
375 group.smv.hw_model = pCompat->hwlist[h].model;
376 group.smv.hw_version = pCompat->hwlist[h].version;
377 if (idp->setup.ssuFuncs.wanted(group.id,group.size,&(group.smv)))
379 err = CreateGroupRequest( idp, pUC, &group );
382 err = handleInLoopError( idp, CLDSM_OK, err );
390 DSC_CmMemRelease( idp, pCompat );
393 #ifdef DSI_TIMEOUT_SUPPORT
394 sectionTimerRemove(idp, pUC->root.pDsiSf);
398 case CLDSM_ERR_END_OF_DATA:
400 DSC_RootCrslLoadRequestFail( idp, &pUC->root );
405 DSC_LoadRsqtFinalise( idp, pUC->root.pLoadRqst );
406 pUC->root.pLoadRqst = NULL;
410 DBGLOG(DD_OC,
"Found update")
418 BOOLEAN DSC_UpdCrslCheckCompatibility(
P_UpdateCarousel pUC, U8BIT *pCompatDesc,
421 P_GroupInfoItem item;
422 item = LLHead(pUC->llcGroups);
425 if (DSC_UtilCheckCompatibility(pCompatDesc, compatLen, item->group.oui, item->group.smv))
429 item = LLNext( item, SSU_GROUP_LIST );
431 return (item)? TRUE : FALSE;
437 P_GroupInfoItem pGII;
438 E_UCLoadStatus status;
442 if (pLoadRqst->targetKind == TT_CAROUSEL)
444 pCarousel = pLoadRqst->target;
448 dsmAssert((pLoadRqst->targetKind == TT_SSU_GROUP));
449 pGII = pLoadRqst->target;
450 pCarousel = LLParent( pGII, SSU_GROUP_LIST );
451 sr.id = pGII->group.id;
453 switch (pLoadRqst->status)
455 case LRS_STALLED_SRG_MODULE:
457 dsmAssert((pCarousel->root.status == RCS_BOOTED));
458 sr.id = pCarousel->root.rcid;
459 status = SSU_NOT_AVAILABLE;
462 case LRS_STALLED_MODULE:
464 dsmAssert((pLoadRqst->targetKind == TT_SSU_GROUP));
465 if (pCarousel->root.status == RCS_BOOTED)
467 pCarousel->root.status = RCS_LOADING;
468 if (pGII->group.size != pLoadRqst->remaining)
470 ERRLOG(DD_OC,
"DATA ERROR: Bad Group size=%u actual=%u", pGII->group.size, pLoadRqst->remaining )
473 status = SSU_CRSL_READY;
474 data = pLoadRqst->remaining;
479 pCarousel->root.status = RCS_LOADED;
480 status = SSU_CRSL_DONE;
485 case LRS_ABORTED_TIMEOUT:
486 case LRS_ABORTED_PATH_ERROR:
487 case LRS_ABORTED_LOAD_ERROR:
488 case LRS_ABORTED_BY_REQUESTER:
489 pCarousel->root.status = RCS_LOAD_FAILED;
490 sr.id = pCarousel->root.rcid;
491 status = SSU_CRSL_ABORT;
494 if (idp->setup.ssuFuncs.status)
496 idp->setup.ssuFuncs.status( (H_DsmCarousel)pCarousel, status, sr, data );
General include file for clDsm library internal definitions.
Header to the sectionTimer module.
Header to the cacheMgr module.
void DSC_UpdCrslDestroy(P_DsmCoreInst idp, P_UpdateCarousel pUC)
Destroy UpdateCarousel.
E_DscError DSC_UpdCrslParseGroupInfo(P_DsmCoreInst idp, P_UpdateCarousel pUC, U8BIT *pDsiPrivate, U16BIT dsiPrivateLen)
Parse DSI private data from Group Info of Update Carousel.
E_DscError DSC_UpdCrslCreate(P_DsmCoreInst idp, U16BIT serviceId, U32BIT carouselId, P_UpdateCarousel *ppUpdateCarousel)
Creates an instance of the UpdateCarousel and initialises it.
Implementation of the Update Carousel module.