/** * @ingroup IxTimeSyncAccCodelet * * @fn ixTimeSyncAccCodeletMbufAllocate () * * @brief Allocate memory for mBuf and its associated data buffer * * @return * @li IX_OSAL_MBUF * - successfully allocated memory for mBuf * @li NULL - fail */ PRIVATE IX_OSAL_MBUF *ixTimeSyncAccCodeletMbufAllocate () { IX_OSAL_MBUF *mBufPtr; UINT8 *dataPtr; /* Allocate cache-aligned memory for mbuf header */ mBufPtr = (IX_OSAL_MBUF *) IX_OSAL_CACHE_DMA_MALLOC (sizeof (IX_OSAL_MBUF)); if (NULL == mBufPtr) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMbufAllocate: failed to allocate memory for mBuf\n", 0, 0, 0, 0, 0, 0); return NULL; } /* initialize mBuf */ ixOsalMemSet (mBufPtr, 0, sizeof (IX_OSAL_MBUF)); /* Allocate cache-aligned memory for mbuf data */ dataPtr = (UINT8 *) IX_OSAL_CACHE_DMA_MALLOC (IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN); if (NULL == dataPtr) { ixOsalLog (IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDERR, "ixTimeSyncAccCodeletMbufAllocate: failed to allocate memory for mBuf's data buffer\n", 0, 0, 0, 0, 0, 0); return NULL; } /* initialize mBuf's data buffer */ ixOsalMemSet (dataPtr, 0, IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN); /* Fill in mbuf header fields */ IX_OSAL_MBUF_MDATA (mBufPtr) = dataPtr; IX_OSAL_MBUF_ALLOCATED_BUFF_DATA (mBufPtr) = (UINT32)dataPtr; IX_OSAL_MBUF_MLEN (mBufPtr) = IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN; IX_OSAL_MBUF_ALLOCATED_BUFF_LEN (mBufPtr) = IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN; IX_OSAL_MBUF_PKT_LEN (mBufPtr) = IX_TIMESYNCACC_CODELET_UDP_FRAME_LEN; return mBufPtr; } /* end of ixTimeSyncAccCodeletMbufAllocate function */
/* * * Transmit loopback parent cell */ PRIVATE IX_STATUS ixOamParentLbCellTx (IxAtmLogicalPort port, UINT32 vpi, UINT32 vci, UINT32 pti) { IxOamITU610Cell *txCell; IxOamITU610LbPayload *lbPayload; IX_OSAL_MBUF *txMbuf; IX_STATUS retval = IX_FAIL; UINT32 lockKey; UINT32 oamHdr = 0x0; /* Get a Tx mbuf */ ixAtmUtilsMbufGet(IX_ATM_OAM_CELL_SIZE_NO_HEC, &txMbuf); if (txMbuf != NULL) { /* set the packet header len */ IX_OSAL_MBUF_PKT_LEN(txMbuf) = IX_OSAL_MBUF_MLEN(txMbuf); txCell = (IxOamITU610Cell *)(IX_OSAL_MBUF_MDATA(txMbuf)); /* Setup shortcut pointers */ lbPayload = &(txCell->payload.lbPayload); /* Set the OAM function type to LB */ IX_OAM_TYPE_AND_FUNC_SET(lbPayload, IX_OAM_ITU610_TYPE_FAULT_MAN_LB); /* Setup the loopback indication */ IX_OAM_LOOPBACK_INDICATION_SET(lbPayload, IX_OAM_ITU610_LB_INDICATION_PARENT); /* Increment the correlation tag and write this into the cell */ lbCorrelationTag++; ixOamMemCpy(lbPayload->correlationTag, (UCHAR *)(&lbCorrelationTag), IX_OAM_ITU610_LB_CORRELATION_TAG_LEN); /* Set Loopback Location Id */ ixOamMemCpy(lbPayload->llid, allOnesLocId, IX_OAM_ITU610_LOCATION_ID_LEN); /* Store the source Id as the CPID */ ixOamMemCpy(lbPayload->sourceId, oamCpid, IX_OAM_ITU610_LOCATION_ID_LEN); /* Set the reserved fields to 0x6a */ ixOamMemSet(lbPayload->reserved, IX_OAM_ITU610_RESERVED_BYTE_VALUE, IX_OAM_ITU610_LB_RESERVED_BYTES_LEN); /* Set the transmit VPI */ IX_OAM_VPI_SET(oamHdr, vpi); /* Set the transmit VCI TX Vci */ IX_OAM_VCI_SET(oamHdr, vci); /* Set the PTI */ IX_OAM_PTI_SET(oamHdr, pti); /* Set the header in buffer */ IX_OAM_HEADER_SET(txCell, oamHdr); /* flush the mbuf frm cache */ ixOamTxFlush( txMbuf ); /* Transmit the cell, not reentrant on a VC basis so protect */ lockKey = ixOsalIrqLock(); retval = ixOamTxAndRetry (oamTxConnId[port], txMbuf, 0, /* CLP 0 */ 1); /* Cells per packet */ ixOsalIrqUnlock (lockKey); if (retval == IX_SUCCESS) { /* Increment the loopback out counter */ parentLbCellTxCount[port]++; } else { /* Release the MBUF */ ixAtmUtilsMbufFree (txMbuf); } } else { IX_OAM_CODELET_IRQ_SAFE_LOG_ERROR("ixOamParentLbCellTx: Failed to get a buffer for transmit"); } return retval; }
PRIVATE IX_STATUS ixEthAccCodeletTxGenRxSinkStart(IxEthAccPortId portId) { IX_OSAL_MBUF *mBufPtr; UINT32 numBufs; IxEthDBStatus status; /* port transmits as fast as possible and drops rx traffic */ if (ixEthAccCodeletPortConfigure(portId, NULL, ixEthAccCodeletRxSinkRxCB, ixEthAccCodeletTxGenTxCB, portId) != IX_ETH_ACC_SUCCESS) { printf("Loopbacks: Failed to start the Tx-Gen Rx-Sink Operation port %u\n", (UINT32)portId); return IX_FAIL; } /* Disable MAC learning and filtering at the port that sinks the frame. With learning enabled at both ports, TxGenRxSink will report buffer underrun and overruns as this mode generates a heavy load of MAC address migrations in the learning/filtering database. */ status = ixEthDBFeatureEnable (portId, IX_ETH_DB_FILTERING, FALSE); if (IX_ETH_DB_SUCCESS == status) { status = ixEthDBFeatureEnable (portId, IX_ETH_DB_LEARNING, FALSE); } if (IX_ETH_DB_SUCCESS == status) { printf("\nMAC learning & filtering are disabled at port %d\n", portId); printf("This is to prohibit the MAC address from being migrated back and forth\n"); printf("between two connected ports in the learning/filtering database.\n\n"); } else { printf("\nFailed to disable MAC learning & filtering at port %d.\n", portId); printf("TxGenRxSink will report buffer underrun and overruns as this mode generates \n"); printf("a heavy load of MAC address migrations in the learning/filtering database. \n"); printf("With learning enabled at both ports, buffer underrun and overruns are expected.\n"); } /* Generate our random data for the payload */ IX_ETHACC_CODELET_DATAGEN(compData); /* Now start the loopback by transmitting the first few frames */ for (numBufs=0; numBufs<IX_ETHACC_CODELET_TXGEN_PCKS; numBufs++) { IX_ETHACC_CODELET_REMOVE_MBUF_FROM_Q_HEAD(ixEthAccCodeletFreeBufQ, mBufPtr); if (mBufPtr == NULL) { printf("Loopbacks: Buffer queue empty. Not enough free buffers to transmit in TxGen-RxSink Loopback!\n"); return (IX_FAIL); } IX_OSAL_MBUF_MLEN(mBufPtr) = IX_ETHACC_CODELET_TXGEN_PCK_LEN; IX_OSAL_MBUF_PKT_LEN(mBufPtr) = IX_ETHACC_CODELET_TXGEN_PCK_LEN; memcpy(IX_OSAL_MBUF_MDATA(mBufPtr), &compData[0], IX_ETHACC_CODELET_TXGEN_PCK_LEN); IX_OSAL_CACHE_FLUSH(IX_OSAL_MBUF_MDATA(mBufPtr), IX_OSAL_MBUF_MLEN(mBufPtr)); if(ixEthAccPortTxFrameSubmit(portId, mBufPtr, IX_ETH_ACC_TX_DEFAULT_PRIORITY) != IX_ETH_ACC_SUCCESS) { printf("Loopbacks: Error Submitting frame for transmission on port %u\n", portId); return (IX_FAIL); } } printf("Port %d Tx pool has %d buffers\n", portId, numBufs); /* enable traffic */ if(ixEthAccPortEnable(portId) != IX_ETH_ACC_SUCCESS) { printf("Loopbacks: Error Enabling port %u\n", (UINT32)portId); return (IX_FAIL); } return (IX_SUCCESS); }