📄 ixatmdrxcfginfo.c
字号:
if ((vcDescriptor->status == IX_ATMDACC_RX_CHANNEL_DOWN) && (vcDescriptor->replenishInProgress == FALSE)) { /* flush the rx free queue */ do { /* read the RX free queue entry */ returnStatus = ixQMgrQRead (vcDescriptor->rxFreeQueueId, &qEntry); } while (returnStatus == IX_SUCCESS && qEntry != 0); /* flush any remaining entry from the rx queue */ while (!IX_ATMDACC_RXQ_ALL_RECYCLED (rxSwQueue)) { /* get the current descriptor */ npeDescriptor = IX_ATMDACC_RXQ_HEAD_ENTRY_GET (rxSwQueue); /* unchain the mbuf (chaining could have started on NPE) */ mbufPtr = npeDescriptor->atmd.pRootMbuf; mbufPtrTmp = mbufPtr; do { IX_ATMDACC_DATA_CACHE_INVALIDATE(mbufPtrTmp, sizeof(mbufPtrTmp)); IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN(UINT32,IX_OSAL_MBUF_MLEN(mbufPtrTmp)); /* convert the mbuf to virtual address space */ IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN (UINT8 *,IX_OSAL_MBUF_MDATA(mbufPtrTmp)); IX_ATMDACC_CONVERT_TO_VIRTUAL_ADDRESS (IX_OSAL_MBUF_MDATA(mbufPtrTmp)); /* Check for unchained mbufs */ if (IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp) != NULL) { /* if unchained mbuf exist, then get the next mbuf */ IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN (IX_OSAL_MBUF *, IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp)); IX_ATMDACC_CONVERT_TO_VIRTUAL_ADDRESS (IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp)); mbufPtrTmp = IX_OSAL_MBUF_NEXT_BUFFER_IN_PKT_PTR(mbufPtrTmp); } else { mbufPtrTmp = NULL; } } while (mbufPtrTmp != NULL); /* move the queue pointer */ IX_ATMDACC_RXQ_HEAD_INCR (rxSwQueue); /* release the mbuf through the user-supplied callback */ rxBitField = npeDescriptor->npe.rx.rxBitField; IX_ATMDACC_CONVERT_FROM_BIG_ENDIAN(UINT32, rxBitField); (*vcDescriptor->rxDoneCallback) ( IX_NPE_A_RXBITFIELD_PORT_GET(rxBitField), vcDescriptor->callbackId, IX_ATMDACC_MBUF_RETURN, IX_ATMDACC_CLP_NOT_SET, mbufPtr); } /* all descriptors should be back */ /* check if resources are still allocated */ returnStatus = ixAtmdAccRxCfgFreeResourcesCheck (npeVcId); } /* end of if(vcDescriptor) */ else { /* rxDisconnectAck is not yet received or * replenish is in progress, which means that resources * are still allocated. */ returnStatus = IX_ATMDACC_RESOURCES_STILL_ALLOCATED; } return returnStatus;}/* ----------------------------------------------* read status callback*/PRIVATE voidixAtmdAccRxCfgNpeAtmStatusReadCallback (IxNpeMhNpeId npeMhNpeId, IxNpeMhMessage npeMhMessage){ UINT32 id; /* Check NpeId */ IX_ATMDACC_ENSURE (npeMhNpeId == IX_NPEMH_NPEID_NPEA, "wrong npeMhNpeId"); /* Check Id */ id = npeMhMessage.data[0] & NPE_RESP_ID_MASK; IX_ATMDACC_ENSURE (id == NPE_ATM_STATUS_READ_EXPECTED_ID, "wrong id"); npeRespWordRead = npeMhMessage.data[1]; /* Unblock the reading context */ IX_ATMDACC_NPE_RESPONSE_LOCK_RELEASE ();}/* --------------------------------------------------* Query the npe ATM status*/PRIVATE IX_STATUSixAtmdAccRxCfgNpeAtmStatusRead (unsigned int * rxFreeUnderflowCount, unsigned int * rxOverflowCount){ IX_STATUS returnStatus; /* get the rx free underflow count */ returnStatus = ixAtmdAccUtilNpeMsgWithResponseSend( IX_NPE_A_MSSG_ATM_STATUS_READ, NPE_MSG_RXFREEUNDERFLOW_ID, NPE_IGNORE, ixAtmdAccRxCfgNpeAtmStatusReadCallback); if (returnStatus == IX_SUCCESS) { /* Wait for ixAtmdAccNpeReadCallback to release */ IX_ATMDACC_NPE_RESPONSE_LOCK_GET (); /* copy the response */ *rxFreeUnderflowCount = npeRespWordRead; /* get the rx underflow count */ returnStatus = ixAtmdAccUtilNpeMsgWithResponseSend( IX_NPE_A_MSSG_ATM_STATUS_READ, NPE_MSG_RXOVERFLOW_ID, NPE_IGNORE, ixAtmdAccRxCfgNpeAtmStatusReadCallback); if (returnStatus == IX_SUCCESS) { /* Wait for ixAtmdAccNpeReadCallback to release */ IX_ATMDACC_NPE_RESPONSE_LOCK_GET (); /* copy the response */ *rxOverflowCount = npeRespWordRead; } } /* map the error */ if (returnStatus != IX_SUCCESS) { returnStatus = IX_FAIL; } return returnStatus;}/* ---------------------------------------------------------* display internals*/voidixAtmdAccRxCfgInfoStatsShow (void){ int vc; int rxStream; IX_STATUS returnStatus; unsigned int numEntries; unsigned int rxOverflowCount, rxFreeUnderflowCount; IxQMgrQId qId; printf("\n"); IX_ATMDACC_FULL_STATS( printf ("Rx Free Dummy notification ................ : %10u (should be 0)\n", ixAtmdAccRxFreeDummyNotificationErrorCount); printf ("Rx Process Dummy notification ............. : %10u (should be 0)\n", ixAtmdAccRxDummyProcessPerformErrorCount); printf ("Rx Enable ................................. : %10u\n", ixAtmdAccRxEnableCount); printf ("Rx Disable ................................ : %10u\n", ixAtmdAccRxDisableCount); printf ("Rx descriptor missing during disconnect ... : %10u (should be 0)\n", ixAtmdAccRxTransportErrorStats.descriptorOrderDisconnectErrorCount); printf ("Rx descriptor missing ..................... : %10u (should be 0)\n", ixAtmdAccRxTransportErrorStats.descriptorOrderErrorCount); printf ("Rx descriptor chaining inconsistent ....... : %10u (should be 0)\n", ixAtmdAccRxTransportErrorStats.mbufChainErrorCount); printf ("Rx descriptor mbuf mismatch ............... : %10u (should be 0)\n", ixAtmdAccRxTransportErrorStats.mbufMismatchErrorCount); printf("\n"); ); ixAtmdAccRxCfgNpeAtmStatusRead(&rxFreeUnderflowCount, &rxOverflowCount); printf ("Rx Free Underflow (Npe) ................... : %10u (should be 0)\n", rxFreeUnderflowCount); printf ("Rx Overflow (Npe) ......................... : %10u (should be 0)\n", rxOverflowCount); printf("\n"); /* iterate through all VCs */ for (vc = 0; vc < IX_ATM_MAX_NUM_AAL_OAM_RX_VCS; vc++) { if (IX_ATMDACC_RX_VC_INUSE(ixAtmdAccRxVcDescriptor[vc].connId)) { char *stringAalType = "???????"; char *stringState = "???????"; switch(ixAtmdAccRxVcDescriptor[vc].status) { case IX_ATMDACC_RX_CHANNEL_UP: stringState = "Up"; break; case IX_ATMDACC_RX_CHANNEL_DOWN: stringState = "DOWN"; break; case IX_ATMDACC_RX_CHANNEL_DOWN_PENDING: stringState = "DOWN PENDING"; break; } switch(ixAtmdAccRxVcDescriptor[vc].npeAalType) { case IX_NPE_A_AAL_TYPE_5: stringAalType = "AAL5 "; break; case IX_NPE_A_AAL_TYPE_0_48: stringAalType = "AAL0_48"; break; case IX_NPE_A_AAL_TYPE_0_52: stringAalType = "AAL0_52"; break; case IX_NPE_A_AAL_TYPE_OAM: stringAalType = "OAM "; break; case IX_NPE_A_AAL_TYPE_INVALID: default: break; } /* display information per VC */ printf ("Rx Channel %2d %s %s connId %8.8x rxFreeQueueId %2d rxQueueId %2d\n", vc, stringAalType, stringState, ixAtmdAccRxVcDescriptor[vc].connId, ixAtmdAccRxVcDescriptor[vc].rxFreeQueueId, ixAtmdAccRxVcDescriptor[vc].rxQueueId); printf (" RxId %u Port %u Vpi %u Vci %u userId %8.8x\n", vc, ixAtmdAccRxVcDescriptor[vc].port, ixAtmdAccRxVcDescriptor[vc].vpi, ixAtmdAccRxVcDescriptor[vc].vci, ixAtmdAccRxVcDescriptor[vc].callbackId); printf (" Descriptor head %10u >= tail %10u\n", ixAtmdAccRxVcDescriptor[vc].queue.head, ixAtmdAccRxVcDescriptor[vc].queue.tail); numEntries = 0; ixAtmdAccRxVcFreeEntriesQuery(ixAtmdAccRxVcDescriptor[vc].connId, &numEntries); printf (" Rx Free queue level %10u\n", ixAtmdAccRxVcDescriptor[vc].rxFreeQueueSize - numEntries); } /* end of if(IX_ATMDACC_RX_VC_INUSE) */ } /* end of for(vc) */ printf("\n"); for (rxStream = 0; rxStream < IX_ATM_MAX_RX_STREAMS; rxStream++) { ixAtmdAccUtilQmgrQIdGet(rxStream, &qId); printf("Queue %2u:\n", qId); IX_ATMDACC_FULL_STATS( printf (" Rx Dispatch invoke ....................... : %10u\n", ixAtmdAccRxDispatchStats[rxStream].invokeCount); printf (" Rx Dispatch failed ....................... : %10u (should be 0)\n", ixAtmdAccRxDispatchStats[rxStream].failedCount); printf (" Rx SPath Pdu received .................... : %10u\n", ixAtmdAccRxDispatchStats[rxStream].spPduCount); printf (" Rx RxDisableAck received ................. : %10u\n", ixAtmdAccRxDispatchStats[rxStream].ackCount); printf (" Rx Max Rx per dispatch ................... : %10u\n", ixAtmdAccRxDispatchStats[rxStream].maxRxPerDispatch); ); /* get the current number of Queue entries */ returnStatus = ixQMgrQNumEntriesGet (qId, &numEntries); /* read again the number of entries */ if (returnStatus == IX_QMGR_WARNING) { returnStatus = ixQMgrQNumEntriesGet (qId, &numEntries); } if (returnStatus != IX_SUCCESS) { printf (" Rx Queue level .............,,,,,,,,,..... : N/A\n"); } else { printf (" Rx Queue level ........................... : %10u\n", numEntries); } /* end of if-else(returnStatus) */ } /* end of for(rxStream) */ printf("\n");}/* ---------------------------------------------------------* display the rx configuration*/voidixAtmdAccRxCfgInfoChannelShow (IxAtmLogicalPort port){ unsigned int vc; /* iterate through the VCs for this port */ for (vc = 0; vc < IX_ATM_MAX_NUM_AAL_OAM_RX_VCS; vc++) { if (IX_ATMDACC_RX_VC_INUSE (ixAtmdAccRxVcDescriptor[vc].connId)) { if (ixAtmdAccRxVcDescriptor[vc].port == port) { IX_ATMDACC_RX_QUEUE *rxSwQueue = &ixAtmdAccRxVcDescriptor[vc].queue; unsigned int numEntries = 0; IX_STATUS returnStatus = ixQMgrQNumEntriesGet(ixAtmdAccRxVcDescriptor[vc].rxFreeQueueId, &numEntries); char *stringAalType = "???????"; switch(ixAtmdAccRxVcDescriptor[vc].npeAalType) { case IX_NPE_A_AAL_TYPE_5: stringAalType = "AAL5 "; break; case IX_NPE_A_AAL_TYPE_0_48: stringAalType = "AAL0_48"; break; case IX_NPE_A_AAL_TYPE_0_52: stringAalType = "AAL0_52"; break; case IX_NPE_A_AAL_TYPE_OAM: stringAalType = "OAM "; break; case IX_NPE_A_AAL_TYPE_INVALID: default: break; } if (returnStatus == IX_QMGR_WARNING) { returnStatus = ixQMgrQNumEntriesGet(ixAtmdAccRxVcDescriptor[vc].rxFreeQueueId, &numEntries); if (returnStatus == IX_QMGR_WARNING) { numEntries = 0; } } /* display data about VC */ printf (" Rx Channel %2u %s ConnId 0x%8.8x UserId 0x%8.8x\n", vc, stringAalType, ixAtmdAccRxVcDescriptor[vc].connId, ixAtmdAccRxVcDescriptor[vc].callbackId); printf (" Vpi %3u Vci %5u MbfsRx %10u MbfsRxf %10u\n", ixAtmdAccRxVcDescriptor[vc].vpi, ixAtmdAccRxVcDescriptor[vc].vci, rxSwQueue->head - rxSwQueue->size, numEntries); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -