This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

In Netfp fast path , On applying Netfp_decodeSrb , unable to get the original data. plz help regarding...

Hi*,

      We are working on EVM6670 with CCS 5.0.1 and pdk_C6670_1_0_0_15.

Below providing the code , which calling netfp_encodeSrb & Netfp_decodeSrb on the same core(CORE 0).

Qmss_QueueHnd srbEncQueueHandle, srbDecQueueHandle, srbEnc1QueueHandle, srbDec1QueueHandle;
uint32_t gtpTunnelId;
Netfp_UserSecCfg userSecCfg;
uint8_t myEncKey[16] =
{0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x00};
uint8_t myMacKey[16] =
{0x1F, 0x1E, 0x1D, 0x1C, 0x1b, 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x00};
Netfp_UserSecHandle ueSecHandle,ueSecHandle_dec;

srbEncQueueHandle = Qmss_queueOpen(Qmss_QueueType_GENERAL_PURPOSE_QUEUE,
QMSS_PARAM_NOT_SPECIFIED, &isAllocated);
if (srbEncQueueHandle == NULL)
{
System_printf ("Error: Unable to open the SRB Encode Queue\n");
return ;
}
srbDecQueueHandle = Qmss_queueOpen(Qmss_QueueType_GENERAL_PURPOSE_QUEUE,
QMSS_PARAM_NOT_SPECIFIED, &isAllocated);
if (srbDecQueueHandle == NULL)
{
System_printf ("Error: Unable to open the SRB Decode Queue\n");
return ;
}

Netfp_FlowHandle gtpuFlowHandle;
gtpuFlowHandle = Netfp_findFlow ("GTPU-FP-Flow");
userSecCfg.authMode = Netfp_AuthMode_CMAC;
userSecCfg.srbCipherMode = Netfp_CipherMode_AES_CTR;
userSecCfg.drbCipherMode = Netfp_CipherMode_AES_CTR;//Netfp_CipherMode_NULL;
userSecCfg.hKeyRrcInt = myMacKey;
userSecCfg.hKeyRrcEnc = myEncKey;
userSecCfg.hKeyUpEnc = myEncKey;
userSecCfg.ueId = 0;
userSecCfg.srbFlowHandle = gtpuFlowHandle;
userSecCfg.initialCountC = 0;
userSecCfg.chSrb1Enc = srbEncQueueHandle;
userSecCfg.chSrb1Dec = srbDecQueueHandle;
userSecCfg.chSrb2Enc = srbEncQueueHandle;
userSecCfg.chSrb2Dec = srbDecQueueHandle;

if ((Netfp_createUserSecContext (&userSecCfg, &ueSecHandle)) < 0)

{
System_printf( "Error: Netfp_createUserSecContext() failed\n");

}
else
System_printf("Netfp Creation Successful\n");

gtpTunnelId = 0xDEAD0000;
Ti_Pkt* ptrPkt;
Ti_Pkt* ptrRxPkt;

 uint32_t    dataBufferLen, packetLen;

uint16_t ueId;
uint8_t qci, rxBearerId;
ETHHDR* ptrEthHeader;
IPHDR_EDIT* ptrIPHeader;
UDPHDR* ptrUDPHeader;
GTPUHDR* ptrGTPUHdr;
uint8_t* ptrDataPayload;
uint8_t* ptrPDCPHeader;
uint8_t* tunnelInfo = (uint8_t*)&gtpTunnelId;

/* Allocate a packet from the heap */
ptrPkt = Pktlib_allocPacket (netfpHeaderHeap, 128);
if (ptrPkt == NULL)
return ;

/* Set the length of the data payload. */
packetLen = 7;

/* Get the data buffer & length */
Pktlib_getDataBuffer(ptrPkt, &ptrDataBuffer, &dataBufferLen);
ptrDataBuffer[0] = 0;                  //Considering it as a PDCP header
ptrDataBuffer[1] = 1;
ptrDataBuffer[2] = 2;
ptrDataBuffer[3] = 3;
ptrDataBuffer[4] = 4;
ptrDataBuffer[5] = 5;
ptrDataBuffer[6] = 6;

Pktlib_setPacketLen(ptrPkt, packetLen);

Pktlib_setDataBufferLen(ptrPkt, packetLen);

appWritebackBuffer(ptrDataBuffer, packetLen);

Pktlib_writebackPkt(ptrPkt);

System_printf("Original\n");
for (index = 0; index < packetLen; index++)
{

System_printf (" %x ", *(ptrDataBuffer + index));

}
System_printf("\n");
/* Call encode SRB slow path */
if (0 != Netfp_encodeSrb (ueSecHandle, ptrPkt, 0, 1))
System_printf("SRB encode error\n");

System_printf("after encode amit\n");
/* Set the index and loop around waiting for the packet to come post ciphering. */
index = 0;

uint8_t* ptrRxDataBuffer;
uint32_t rxDataBufferLen;
uint32_t rxCountC;

/* Did we get the packet? */
while( (ptrRxPkt = (Ti_Pkt *)QMSS_DESC_PTR(Qmss_queuePop (srbEncQueueHandle)))== NULL);

Pktlib_getDataBuffer (ptrRxPkt, &ptrRxDataBuffer, &rxDataBufferLen);

Pktlib_setPacketLen(ptrRxPkt, rxDataBufferLen);
Pktlib_setDataBufferLen(ptrRxPkt, rxDataBufferLen);
appWritebackBuffer(ptrRxDataBuffer, rxDataBufferLen);
Pktlib_writebackPkt(ptrRxPkt);

System_printf("Encoded\n");

for (index = 0; index < rxDataBufferLen; index++)
{

System_printf ("%x ", *(ptrRxDataBuffer + index));

}
System_printf("\n");

/* Sanity Check: Ensure the received buffer length includes the MAC-I for LTE_CP and PDCP header for LTE */
if (rxDataBufferLen != packetLen + 4)
{
System_printf ("Error: Sent %d bytes Got %d bytes\n", packetLen, rxDataBufferLen);

}

Netfp_getPacketId (ptrRxPkt, &ueId, &qci, &rxBearerId);
System_printf ("Debug: Received packet for UE %d QCI %d Bearer Id %d\n", ueId, qci, rxBearerId);


if (0 != Netfp_decodeSrb (ueSecHandle_dec, ptrRxPkt, 0, 1))
System_printf("SRB decode error\n");

while((  ptrRxPkt = (Ti_Pkt *)QMSS_DESC_PTR(Qmss_queuePop (srbDecQueueHandle)))== NULL);

Pktlib_getDataBuffer (ptrRxPkt, &ptrRxDataBuffer, &rxDataBufferLen);

Pktlib_setPacketLen(ptrRxPkt, rxDataBufferLen);
Pktlib_setDataBufferLen(ptrRxPkt, rxDataBufferLen);
appWritebackBuffer(ptrRxDataBuffer, rxDataBufferLen);
Pktlib_writebackPkt(ptrRxPkt);

/* Sanity Check: Ensure the received buffer length includes the MAC-I for LTE_CP and no CountC for LTE */
if (rxDataBufferLen != packetLen + 4)

{
System_printf ("Error: Sent %d bytes Got %d bytes\n", packetLen, rxDataBufferLen);

}

System_printf("Decoded\n");
/* Sanity Check: Compare the received packet with the transmitted packet. */
for (index = 0; index < rxDataBufferLen; index++)
{
System_printf ("%x ",*(ptrRxDataBuffer + index));

}

System_printf("\n");

/* Packet was received; test passed. Cleanup the packet. */
Pktlib_freePacket(ptrRxPkt);
return ;

The Output, which i am getting;

Original       0  1  2  3  4  5  6 

Encoded        0 f7 cb a9 59 7f 61 d2 52 25 d4 

Decoded        0 5d 29 ba 90 53 c1 61 15 8e 85 

Expected O/p; Decoded       0 1 2 3 4 5 6 d2 52 25 d4