net_test changes to support GCM/CCM algorithms
authorTinku Mannan <tmannan@ti.com>
Fri, 19 Oct 2012 17:37:19 +0000 (13:37 -0400)
committerTinku Mannan <tmannan@ti.com>
Fri, 19 Oct 2012 17:37:19 +0000 (13:37 -0400)
ti/runtime/netapi/netapi_tune.h
ti/runtime/netapi/test/net_test.c
ti/runtime/netapi/test/net_test.h

index 5f40430ecccd9038ed90b06063dce9500864be44..7a80a9ae728399b95c7a925798ccbff04c37bab2 100755 (executable)
  * @def TUNE_NETAPI_MAX_NUM_IPSEC_CHANNELS
  *      This defines the number maximum number of ipsec channels
  */
-#define TUNE_NETAPI_MAX_NUM_IPSEC_CHANNELS     32
+#define TUNE_NETAPI_MAX_NUM_IPSEC_CHANNELS     64
 #else
 /**
  * @ingroup tune_parameters
index ce67fc979d10dbf3b0ced18a275bcb7e441ff1d3..cb32319e0f6f3b525684212714b72b203cf6748e 100755 (executable)
@@ -40,7 +40,7 @@
  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
  *****************************************/
-#define NET_TEST_ENABLE_SIDE_BAND_LOW_LEVEL_API
+//#define NET_TEST_ENABLE_SIDE_BAND_LOW_LEVEL_API
 #ifdef NET_TEST_ENABLE_SIDE_BAND_LOW_LEVEL_API
 #define NWAL_ENABLE_SA
 #endif
@@ -359,7 +359,7 @@ NETCP_CFG_CLASSIFIER_T class_2_cfg=
 PKTIO_CONTROL_T zap_channel_control={PKTIO_CLEAR, NULL};
 
 /* security objects. (for loopback mode) */
-netTestSA_t sa_info[4];
+netTestSA_t sa_info[6];
 int netapi_algorithm_set = 0;
 int netapi_sec_sa_mode = 2;
 /* tmannan-end */
@@ -373,7 +373,7 @@ NETCP_CFG_IPSEC_POLICY_T rx_policy[4];
 /* rx */
 
 
-NETAPI_SEC_SA_INFO_T rx_sa [4] = {
+NETAPI_SEC_SA_INFO_T rx_sa [7] = {
 {
     NWAL_SA_DIR_INBOUND,
     0x11111111,  //spi
@@ -425,11 +425,50 @@ NETAPI_SEC_SA_INFO_T rx_sa [4] = {
     NWAL_SA_AALG_HMAC_MD5,
     NWAL_SA_EALG_NULL,
     0,0  //na
+},
+{
+    NWAL_SA_DIR_INBOUND,
+    0x55555555,  //spi
+    nwal_IpSecProtoESP, //ESP mode
+    nwal_SA_MODE_TUNNEL,  //tunnel mode
+    nwal_IPV4, //v4
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* Src IP (them) -> set below */
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* dst IP (us)-> set below*/
+    64,/* replayWindow */
+    NWAL_SA_AALG_NULL,
+    NWAL_SA_EALG_AES_GCM,
+    0,0  //na
+},
+{
+    NWAL_SA_DIR_INBOUND,
+    0x66666666,  //spi
+    nwal_IpSecProtoESP, //ESP mode
+    nwal_SA_MODE_TUNNEL,  //tunnel mode
+    nwal_IPV4, //v4
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* Src IP (them) -> set below */
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* dst IP (us)-> set below*/
+    64,/* replayWindow */
+    NWAL_SA_AALG_NULL,
+    NWAL_SA_EALG_AES_CCM,
+    0,0  //na
+},
+{
+    NWAL_SA_DIR_INBOUND,
+    0x77777777,  //spi
+    nwal_IpSecProtoESP, //ESP mode
+    nwal_SA_MODE_TUNNEL,  //tunnel mode
+    nwal_IPV4, //v4
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* Src IP (them) -> set below */
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* dst IP (us)-> set below*/
+    64,/* replayWindow */
+    NWAL_SA_AALG_GMAC,
+    NWAL_SA_EALG_NULL,
+    0,0  //na
 }
 };
 
 /*tx */
-NETAPI_SEC_SA_INFO_T tx_sa[4]= {
+NETAPI_SEC_SA_INFO_T tx_sa[7]= {
 {
     NWAL_SA_DIR_OUTBOUND,
     0x11111111,  //spi
@@ -480,11 +519,49 @@ NETAPI_SEC_SA_INFO_T tx_sa[4]= {
     64, /* NA replayWindow */
     NWAL_SA_AALG_HMAC_MD5,
     NWAL_SA_EALG_NULL,
-    0,0  //seq no
+},
+{
+    NWAL_SA_DIR_OUTBOUND,
+    0x55555555,  //spi
+    nwal_IpSecProtoESP, //ESP mode
+    nwal_SA_MODE_TUNNEL,  //tunnel mode
+    nwal_IPV4, //v4
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* Src IP (them) -> set below */
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* dst IP (us)-> set below*/
+    64,/* replayWindow */
+    NWAL_SA_AALG_NULL,
+    NWAL_SA_EALG_AES_GCM,
+    0,0  //na
+},
+{
+    NWAL_SA_DIR_OUTBOUND,
+    0x66666666,  //spi
+    nwal_IpSecProtoESP, //ESP mode
+    nwal_SA_MODE_TUNNEL,  //tunnel mode
+    nwal_IPV4, //v4
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* Src IP (them) -> set below */
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* dst IP (us)-> set below*/
+    64,/* replayWindow */
+    NWAL_SA_AALG_NULL,
+    NWAL_SA_EALG_AES_CCM,
+    0,0  //na
+},
+{
+    NWAL_SA_DIR_OUTBOUND,
+    0x77777777,  //spi
+    nwal_IpSecProtoESP, //ESP mode
+    nwal_SA_MODE_TUNNEL,  //tunnel mode
+    nwal_IPV4, //v4
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* Src IP (them) -> set below */
+    { 1, 2, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* dst IP (us)-> set below*/
+    64,/* replayWindow */
+    NWAL_SA_AALG_GMAC,
+    NWAL_SA_EALG_NULL,
+    0,0  //na
 }
 };
 
-static nwalSecKeyParams_t ourTXKeyParams[4] ={
+static nwalSecKeyParams_t ourTXKeyParams[7] ={
 {
     16, /* encKeySize: CTR 16 bytes Encryption Key and 4 bytes Salt : 24 bytes:NWAL_SA_EALG_3DES_CBC and 0 bytes Salt*/
     20, /* macKeySize: 16 bytes NWAL_SA_AALG_HMAC_SHA1 */
@@ -508,11 +585,29 @@ static nwalSecKeyParams_t ourTXKeyParams[4] ={
     16, /* MD5, 16 bytes */
     NULL, //set below
     NULL, //set below
+},
+{
+    20, /* encKeySize: GCM 16 bytes Encryption Key and 4 bytes Salt */
+    0, /* macKeySize: 0*/
+    NULL, //set below
+    NULL, //set below
+},
+{
+    19, /* encKeySize: CTR 16 bytes Encryption Key and 3 bytes Salt : 24 bytes:NWAL_SA_EALG_AES_CTR and 0 bytes Salt*/
+    0, /* macKeySize 0*/
+    NULL, //set below
+    NULL, //set below
+},
+{
+    0, /* encKeySize: CTR 16 bytes Encryption Key and 3 bytes Salt : 24 bytes:NWAL_SA_EALG_AES_CTR and 0 bytes Salt*/
+    24, /* macKeySize 0*/
+    NULL, //set below
+    NULL, //set below
 }
 };
 
 /* these keys are for aes-ctr and hmac sha2_256 */
-static nwalSecKeyParams_t ourRXKeyParams[4] ={
+static nwalSecKeyParams_t ourRXKeyParams[7] ={
 {
     16, /* encKeySize: CTR 16 bytes Encryption Key and 4 bytes Salt : 24 bytes:NWAL_SA_EALG_3DES_CBC and 0 bytes Salt*/
     20, /* macKeySize: 16 bytes NWAL_SA_AALG_HMAC_SHA1 */
@@ -536,6 +631,24 @@ static nwalSecKeyParams_t ourRXKeyParams[4] ={
     16, /* NWAL_SA_AALG_HMAC_MD5, 16 bytes */
     NULL, //set below
     NULL, //set below
+},
+{
+    20, /* encKeySize: GCM 16 bytes Encryption Key and 4 bytes Salt */
+    0, /* macKeySize: 0*/
+    NULL, //set below
+    NULL, //set below
+},
+{
+    19, /* encKeySize: CTR 16 bytes Encryption Key and 3 bytes Salt t*/
+    0, /* macKeySize 0*/
+    NULL, //set below
+    NULL, //set below
+},
+{
+    0, /* encKeySize: CTR 16 bytes Encryption Key and 3 bytes Salt : 24 bytes:NWAL_SA_EALG_AES_CTR and 0 bytes Salt*/
+    24, /* macKeySize 0*/
+    NULL, //set below
+    NULL, //set below
 }
 };
 
@@ -900,6 +1013,7 @@ uint16_t i=1;   /* for testing only */
 uint8_t *p_spi; 
 netTestSA_t * p_sa_info;
 uint8_t p_iv[16];
+    uint8_t p_add[8];
 Cppi_HostDesc*          pPloadDesc;
 
 Pktlib_setPacketLen(tip,len);
@@ -915,10 +1029,10 @@ memcpy(&p_pkt[14+12],&p_pkt[14+12+4],4);
 memcpy(&p_pkt[14+12+4],&ip_temp,4);
 
 //outer checksum to 0
-if (!flag) memset(&p_pkt[14+10],0,2);
-
-
-
+    if (!flag) 
+    {
+        memset(&p_pkt[14+10],0,2);
+    }
 
 //inner ip &udp for ipsec
 if (flag) 
@@ -937,11 +1051,12 @@ if (flag)
         stats.n_new+=1;Pktlib_freePacket(tip); return;
     }
 
+        /* flip inner IP */
 memcpy(&ip_temp, &p_pkt[p_sa_info->tx_payload_info.encOffset+12],4);
 memcpy(&p_pkt[p_sa_info->tx_payload_info.encOffset+12],&p_pkt[p_sa_info->tx_payload_info.encOffset+12+4],4);
 memcpy(&p_pkt[p_sa_info->tx_payload_info.encOffset+12+4],&ip_temp,4);
 
-//udp
+        /* setting udp ports */
 memcpy(&p_pkt[p_sa_info->tx_payload_info.encOffset+20+2],&new_dest_port[0],2);
 memset(&p_pkt[p_sa_info->tx_payload_info.encOffset+20+6],0,2); //checksum
 
@@ -982,7 +1097,7 @@ memset(&p_pkt[14+20+6],0,2);//0 udp checksum (we will compute on way out
 memcpy(&p_pkt[14+20+2],&new_dest_port[0],2);
 }
 
-//IPSEC case, 
+    /*IPSEC case */ 
 if (flag)
 {
         if (config.ipsec_mode_tx == IPSEC_MODE_TX_SIDEBAND)
@@ -1010,8 +1125,8 @@ if (flag)
             memcpy(&meta_tx, &(p_sa_info->tx_payload_info), sizeof(nwalDmTxPayloadInfo_t));
 
           
-           meta_tx.encSize = len - p_sa_info->tx_payload_info.encOffset -netTest_ICV_LEN;
-           meta_tx.authSize = len - meta_tx.authOffset - netTest_ICV_LEN;
+                meta_tx.encSize = len - p_sa_info->tx_payload_info.encOffset -p_sa_info->auth_tag_size;
+                meta_tx.authSize = len - meta_tx.authOffset - p_sa_info->auth_tag_size;
 
 #if 0
             printf("flip_and_send_pkt(): encOffset %d\n", meta_tx.encOffset);
@@ -1020,6 +1135,9 @@ if (flag)
             printf("flip_and_send_pkt(): authSize %d\n", meta_tx.authSize);
 #endif
 
+            meta_tx.pAuthIV=NULL;
+            meta_tx.aadSize=0;
+            meta_tx.pAad=NULL;
         if (p_sa_info->cipherMode ==  NWAL_SA_EALG_AES_CTR)
         {
            memcpy(&p_iv[0], &ourEncrKey[16], 4);
@@ -1030,6 +1148,15 @@ if (flag)
             p_iv[15] = 1;
            meta_tx.pEncIV = &p_iv[0];
          }
+            else if ((p_sa_info->cipherMode == NWAL_SA_EALG_AES_GCM) ||
+                (p_sa_info->cipherMode == NWAL_SA_EALG_AES_CCM))
+                {
+                        memcpy(&p_iv[0], &p_pkt[netTest_MAC_HEADER_LEN +netTest_IP_HEADER_LEN + netTest_ESP_HEADER_LEN], 8);
+                        meta_tx.pEncIV = &p_iv[0];
+                        memcpy(&p_add[0], &p_pkt[netTest_MAC_HEADER_LEN +netTest_IP_HEADER_LEN], 8);
+                        meta_tx.pAad= &p_add[0];
+                        meta_tx.aadSize = 8;
+                }
         else if (p_sa_info->cipherMode ==  NWAL_SA_EALG_NULL)
         {
             meta_tx.pEncIV = NULL;
@@ -1038,9 +1165,6 @@ if (flag)
         {
             meta_tx.pEncIV = &p_pkt[netTest_MAC_HEADER_LEN +netTest_IP_HEADER_LEN + netTest_ESP_HEADER_LEN ];
         }
-           meta_tx.pAuthIV=NULL;
-           meta_tx.aadSize=0;
-           meta_tx.pAad=NULL;
            /* post it to netcp sb tx channel*/
            meta_tx.appCtxId = (nwal_AppId)netapi_timing_start();
            meta.u.tx_sb_meta=&meta_tx;
@@ -1199,7 +1323,7 @@ char * p_pkt;
 HEAD_T * p_head;
 HEAD_T temp_head;
 int tag_cmp=0;
-unsigned int hash[3];
+unsigned int hash[4];
 uint8_t *p_spi;
 netTestSA_t *p_sa_info;
 
@@ -1234,23 +1358,24 @@ unsigned long time, delta_time;
            hash[0]= htonl( meta[i].u.rx_sb_meta->pAuthTag[0]);
            hash[1]= htonl( meta[i].u.rx_sb_meta->pAuthTag[1]);
            hash[2]= htonl( meta[i].u.rx_sb_meta->pAuthTag[2]);
-
+           hash[3]= htonl( meta[i].u.rx_sb_meta->pAuthTag[3]);
            if(stats.sb_rx<=16)
            {
              char *tp = (char *) &hash[0];
              //dump_header((long*)p_pkt, stats.sb_rx, (int)meta[i].u.rx_sb_meta->appId,0);
 #if 0
-             printf("tag in pkt=%x %x %x %x %x %x %x %x %x %x %x %x\n",
+             printf("decrypt complete: tag in pkt= %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
+                      p_pkt[len-16],p_pkt[len-15],p_pkt[len-14],p_pkt[len-13],
                       p_pkt[len-12],p_pkt[len-11],p_pkt[len-10],p_pkt[len-9], p_pkt[len-8],
                       p_pkt[len-7],p_pkt[len-6],
                       p_pkt[len-5],p_pkt[len-4],p_pkt[len-3],p_pkt[len-2],p_pkt[len-1]);
-             printf("tag from SA=%x %x %x %x %x %x %x %x %x %x %x %x\n",
+             printf("decrypt complete: tag from SA=%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
                        tp[0],tp[1],tp[2],tp[3],tp[4],tp[5],
-                       tp[6],tp[7],tp[8],tp[9],tp[10],tp[11]);
+                       tp[6],tp[7],tp[8],tp[9],tp[10],tp[11],tp[12],tp[13],tp[14],tp[15]);
 #endif
            }
            //check tag 
-           tag_cmp = memcmp(&p_pkt[len-12],(char*) &hash[0],12); //todo, really use meta->authTagLen
+           tag_cmp = memcmp(&p_pkt[len-p_sa_info->auth_tag_size],(char*) &hash[0],p_sa_info->auth_tag_size); //todo, really use meta->authTagLen
            stats.n_auth_ok += !(tag_cmp);
            
             flip_and_send_pkt(tip, p_pkt, len,1);  //flip packet to echo back and send
@@ -1261,24 +1386,25 @@ unsigned long time, delta_time;
            hash[0]= htonl( meta[i].u.rx_sb_meta->pAuthTag[0]);
            hash[1]= htonl( meta[i].u.rx_sb_meta->pAuthTag[1]);
            hash[2]= htonl( meta[i].u.rx_sb_meta->pAuthTag[2]);
+           hash[3]= htonl( meta[i].u.rx_sb_meta->pAuthTag[3]);
            stats.sb_tx+=1;
            if(stats.sb_tx<=16)
            {
              char *tp1 = (char *) &hash[0];
              //dump_header((long*)p_pkt, stats.sb_tx, (int)meta[i].u.rx_sb_meta->appId,0);
 #if 0
-             printf("tag in original rx pkt=%x %x %x %x %x %x %x %x %x %x %x %x\n",
+            printf("encrypt complete: tag in pkt=  %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
+                      p_pkt[len-16],p_pkt[len-15],p_pkt[len-14],p_pkt[len-13],
                       p_pkt[len-12],p_pkt[len-11],p_pkt[len-10],p_pkt[len-9], p_pkt[len-8],
                       p_pkt[len-7],p_pkt[len-6],
                       p_pkt[len-5],p_pkt[len-4],p_pkt[len-3],p_pkt[len-2],p_pkt[len-1]);
-
-             printf("tag from SA=%x %x %x %x %x %x %x %x %x %x %x %x\n",
+             printf("encrypt complete: tag from SA=%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
                        tp1[0],tp1[1],tp1[2],tp1[3],tp1[4],tp1[5],
-                       tp1[6],tp1[7],tp1[8],tp1[9],tp1[10],tp1[11]);
+                       tp1[6],tp1[7],tp1[8],tp1[9],tp1[10],tp1[11],tp1[12],tp1[13],tp1[14],tp1[15]);
 #endif
            }
            //put the computed tag in the packet
-           memcpy(&p_pkt[len-12],(char*)&hash[0],12); //todo, really use meta->authTagLen
+           memcpy(&p_pkt[len-p_sa_info->auth_tag_size],(char*)&hash[0],p_sa_info->auth_tag_size); //todo, really use meta->authTagLen
            {
           PKTIO_METADATA_T meta2 = {PKTIO_META_TX,{0},0};
            nwalTxPktInfo_t meta_tx={0};
@@ -1299,6 +1425,7 @@ unsigned long time, delta_time;
            /* post it to netcp tx channel*/
            meta2.u.tx_meta=&meta_tx;
            pktio_send(netcp_tx_chan,tip,&meta2,&err);
+           netapi_utilCacheWbInv(p_pkt,len);
            stats.tx +=1;
            }
         }
@@ -1327,6 +1454,10 @@ HEAD_T temp_head;
 netTestSA_t *p_sa_info;
 uint8_t *p_spi;
 uint8_t p_iv[16];
+    uint8_t p_add[8];
+    int16_t       retVal;
+                    nwalGlobCxtInfo_t   nwalGlobCxt;
+                    nwalLocCxtInfo_t    nwalLocCxt;
 Cppi_HostDesc*          pPloadDesc;
 
     p_head=&temp_head;
@@ -1410,8 +1541,8 @@ Cppi_HostDesc*          pPloadDesc;
 
            memcpy(&meta_tx, &(p_sa_info->tx_payload_info), sizeof(nwalDmTxPayloadInfo_t));
 
-           meta_tx.encSize = len - p_sa_info->tx_payload_info.encOffset -netTest_ICV_LEN;
-           meta_tx.authSize = len - meta_tx.authOffset - netTest_ICV_LEN;
+                    meta_tx.encSize = len - p_sa_info->tx_payload_info.encOffset -p_sa_info->auth_tag_size;
+                    meta_tx.authSize = len - meta_tx.authOffset - p_sa_info->auth_tag_size;
 
 #if 0
             printf("recv_cb(): encOffset %d\n", meta_tx.encOffset);
@@ -1429,7 +1560,17 @@ Cppi_HostDesc*          pPloadDesc;
                 p_iv[14] = 0;
                 p_iv[15] = 1;
                  meta_tx.pEncIV = &p_iv[0];
-            }
+                }
+                else if ((p_sa_info->cipherMode == NWAL_SA_EALG_AES_GCM)  ||
+                            (p_sa_info->cipherMode == NWAL_SA_EALG_AES_CCM))
+                {
+                        memcpy(&p_iv[0], &p_pkt[netTest_MAC_HEADER_LEN +netTest_IP_HEADER_LEN + netTest_ESP_HEADER_LEN], 8);
+                        meta_tx.pEncIV = &p_iv[0];
+                        /* aad is the ESP header which is 8 bytes */
+                        memcpy(&p_add[0], &p_pkt[netTest_MAC_HEADER_LEN +netTest_IP_HEADER_LEN], 8);
+                        meta_tx.pAad= &p_add[0];
+                        meta_tx.aadSize = 8;
+                }
             else if (p_sa_info->cipherMode ==  NWAL_SA_EALG_NULL)
             {
                 meta_tx.pEncIV = NULL;
@@ -1520,6 +1661,7 @@ Cppi_HostDesc*          pPloadDesc;
     //printf("recv done\n");
 }
 
+#ifdef TEST_TIMERS
 //timer callback 
 void our_timer_cb( NETAPI_TIMER_GROUP_HANDLE_T th,
         int n_fired,     //# timers fired
@@ -1575,7 +1717,7 @@ for(i=0;i<n_fired;i++)
   tx = netapi_TimerGetNext(fired_list,tx); 
 }
 }
-
+#endif
 void print_ipsec_stats(Sa_IpsecStats_t     *p_saIpsecStats, nwal_saAALG auth, nwal_saEALG cipher)
 {
 #if 0
@@ -1726,9 +1868,12 @@ for(i=0;i<TUNE_NETAPI_CONFIG_MAX_SA_TO_PA_DESC;i++)
    dump_descr(tip, i);
 }
 #endif
+#ifdef TEST_TIMERS
+//debug = dump timer polling stats
+dump_poll_stats();
 //debug = dump timer polling stats
 //dump_poll_stats();
-
+#endif
 #ifndef EXPERIMENTAL
     for (i = 0; i < MAX_SEC_INDEX; i++)
 #else
@@ -1767,6 +1912,7 @@ for(i=0;i<TUNE_NETAPI_CONFIG_MAX_SA_TO_PA_DESC;i++)
                                    tx_sa[i].cipherMode);
         }
     }
+netapi_dump_internal_heap_stats();
 }
 
 //******************************************************
@@ -1969,7 +2115,7 @@ if ((house_pkts_gened>0) && (! (house_pkts_gened%1000)) )
 
 void  build_sa_db(int i)
 {
-
+    long tmp_spi;
     if ((tx_sa[i].authMode == NWAL_SA_AALG_HMAC_SHA1) && (tx_sa[i].cipherMode == NWAL_SA_EALG_AES_CBC))
     {
         /* static configuration, will not change */
@@ -2014,7 +2160,8 @@ void  build_sa_db(int i)
        
         sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
 
-         trie_insert(p_trie_sa,(char *)&(tx_sa[i].spi),4, (void *) &sa_info[i]); //asociate with tx sa SPI
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
          
     }
     else if ((tx_sa[i].authMode == NWAL_SA_AALG_HMAC_SHA2_256) && (tx_sa[i].cipherMode == NWAL_SA_EALG_AES_CTR))
@@ -2028,7 +2175,7 @@ void  build_sa_db(int i)
         sa_info[i].tx_payload_info.encOffset = netTest_MAC_HEADER_LEN +
                                                                      netTest_IP_HEADER_LEN +
                                                                     netTest_ESP_HEADER_LEN +
-                                                                    netTest_AES_CTR_IV_PACKET_LEN;
+                                                                    netTest_AES_CTR_IV_LEN;
 
 
 
@@ -2064,7 +2211,8 @@ void  build_sa_db(int i)
        
         sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
 
-       trie_insert(p_trie_sa,(char *)&(tx_sa[i].spi),4, (void *) &sa_info[i]); //asociate with tx sa SPI
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
     }
     else if ((tx_sa[i].authMode == NWAL_SA_AALG_HMAC_SHA2_256) && (tx_sa[i].cipherMode == NWAL_SA_EALG_3DES_CBC))
     {
@@ -2109,7 +2257,8 @@ void  build_sa_db(int i)
        
         sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
 
-       trie_insert(p_trie_sa,(char *)&(tx_sa[i].spi),4, (void *) &sa_info[i]); //asociate with tx sa SPI
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
     }
     else if ((tx_sa[i].authMode == NWAL_SA_AALG_HMAC_MD5) && (rx_sa[i].cipherMode == NWAL_SA_EALG_NULL))
     {
@@ -2154,9 +2303,160 @@ void  build_sa_db(int i)
         sa_info[i].tx_pkt_info.saPayloadLen = 0;
         sa_info[i].tx_pkt_info.pseudoHdrChecksum =0;
        
+        sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
+    }
+    else if ((tx_sa[i].authMode == NWAL_SA_AALG_NULL) && (rx_sa[i].cipherMode == NWAL_SA_EALG_AES_GCM))
+    {
+        /* static configuration, will not change */
+        sa_info[i].tx_payload_info.aadSize = 0;
+        sa_info[i].tx_payload_info.pAad = NULL;
+        sa_info[i].tx_payload_info.pAuthIV = NULL;
+        sa_info[i].tx_payload_info.authOffset = netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN;        /*done: same for all cipher suites */
+        //sa_info[i].tx_payload_info.encIvSize = netTest_AES_GCM_IV_LEN;
+
+        sa_info[i].tx_payload_info.encOffset =         netTest_MAC_HEADER_LEN +
+                                                                     netTest_IP_HEADER_LEN +
+                                                                    netTest_ESP_HEADER_LEN +
+                                                                    netTest_AES_GCM_IV_LEN;
+#ifdef EXPERIMENTAL
+        sa_info[i].iv_len=0;
+        sa_info[i].bl=4;
+        sa_info[i].spi = tx_sa[i].spi;
+        sa_info[i].src =*((unsigned int *)(&config.local_ipsec_ip.ipv4[0]));
+        sa_info[i].dst =*((unsigned int *)(&config.remote_ipsec_ip.ipv4[0]));
+#endif
+
+
+        /* dynamic configuration, will  be calculated on the fly */
+        sa_info[i].tx_payload_info.authSize = 0;
+        sa_info[i].tx_payload_info.encSize = 0;
+        //sa_info[i].tx_payload_info.ploadLen = 0;
+        sa_info[i].tx_payload_info.pEncIV = 0;
+        sa_info[i].tx_payload_info.pPkt = 0;
+
+        sa_info[i].cipherMode = NWAL_SA_EALG_AES_GCM;
+        sa_info[i].inner_ip_offset = sa_info[i].tx_payload_info.encOffset;
+        sa_info[i].auth_tag_size = netTest_AES_GCM_CCM_ICV_LEN;  /* icv or mac size,. always 12 except for AES_CCM/AES_GCM */
+
+        sa_info[i].tx_pkt_info.enetPort = 0;
+        sa_info[i].tx_pkt_info.ipOffBytes = sa_info[i].tx_payload_info.encOffset;
+        sa_info[i].tx_pkt_info.l4HdrLen = netTest_UDP_HEADER_LEN; /*UDP header len */
+        sa_info[i].tx_pkt_info.l4OffBytes = sa_info[i].inner_ip_offset + netTest_IP_HEADER_LEN;
+        sa_info[i].tx_pkt_info.startOffset = 0;
+        sa_info[i].tx_pkt_info.lpbackPass = 0;
+        sa_info[i].tx_pkt_info.ploadLen = 0; /*sa_info[i].tx_pkt_info.l4OffBytes + 4 */
+        sa_info[i].tx_pkt_info.pPkt = NULL;
+        sa_info[i].tx_pkt_info.saOffBytes = netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN;
+        sa_info[i].tx_pkt_info.saPayloadLen = 0;
+        sa_info[i].tx_pkt_info.pseudoHdrChecksum =0;
+       
+        sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
+
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
+    }
+    else if ((tx_sa[i].authMode == NWAL_SA_AALG_NULL) && (rx_sa[i].cipherMode == NWAL_SA_EALG_AES_CCM))
+    {
+        /* static configuration, will not change */
+        sa_info[i].tx_payload_info.aadSize = 0;
+        sa_info[i].tx_payload_info.pAad = NULL;
+        //sa_info[i].tx_payload_info.authIvSize = 0;
+        sa_info[i].tx_payload_info.pAuthIV = NULL;
+        sa_info[i].tx_payload_info.authOffset = netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN;        /*done: same for all cipher suites */
+
+        sa_info[i].tx_payload_info.encOffset =         netTest_MAC_HEADER_LEN +
+                                                                     netTest_IP_HEADER_LEN +
+                                                                    netTest_ESP_HEADER_LEN +
+                                                                    netTest_AES_CCM_IV_LEN;
+#ifdef EXPERIMENTAL
+        sa_info[i].iv_len=0;
+        sa_info[i].bl=4;
+        sa_info[i].spi = tx_sa[i].spi;
+        sa_info[i].src =*((unsigned int *)(&config.local_ipsec_ip.ipv4[0]));
+        sa_info[i].dst =*((unsigned int *)(&config.remote_ipsec_ip.ipv4[0]));
+#endif
+
+
+        /* dynamic configuration, will  be calculated on the fly */
+        sa_info[i].tx_payload_info.authSize = 0;
+        sa_info[i].tx_payload_info.encSize = 0;
+        //sa_info[i].tx_payload_info.ploadLen = 0;
+        sa_info[i].tx_payload_info.pEncIV = 0;
+        sa_info[i].tx_payload_info.pPkt = 0;
+
+        sa_info[i].cipherMode = NWAL_SA_EALG_AES_CCM;
+        sa_info[i].inner_ip_offset = sa_info[i].tx_payload_info.encOffset;
+        sa_info[i].auth_tag_size = netTest_AES_GCM_CCM_ICV_LEN;  /* icv or mac size,. always 12 except for AES_CCM/AES_GCM */
+
+        sa_info[i].tx_pkt_info.enetPort = 0;
+        sa_info[i].tx_pkt_info.ipOffBytes = sa_info[i].tx_payload_info.encOffset;
+        sa_info[i].tx_pkt_info.l4HdrLen = netTest_UDP_HEADER_LEN; /*UDP header len */
+        sa_info[i].tx_pkt_info.l4OffBytes = sa_info[i].inner_ip_offset + netTest_IP_HEADER_LEN;
+        sa_info[i].tx_pkt_info.startOffset = 0;
+        sa_info[i].tx_pkt_info.lpbackPass = 0;
+        sa_info[i].tx_pkt_info.ploadLen = 0; /*sa_info[i].tx_pkt_info.l4OffBytes + 4 */
+        sa_info[i].tx_pkt_info.pPkt = NULL;
+        sa_info[i].tx_pkt_info.saOffBytes = netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN;
+        sa_info[i].tx_pkt_info.saPayloadLen = 0;
+        sa_info[i].tx_pkt_info.pseudoHdrChecksum =0;
+       
+        sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
+
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
+    }
+    else if ((tx_sa[i].authMode == NWAL_SA_AALG_GMAC) && (rx_sa[i].cipherMode == NWAL_SA_EALG_NULL))
+    {
+        /* static configuration, will not change */
+        sa_info[i].tx_payload_info.aadSize = 0;
+        sa_info[i].tx_payload_info.pAad = NULL;
+        sa_info[i].tx_payload_info.pAuthIV = NULL;
+        sa_info[i].tx_payload_info.authOffset = netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN;
+
+
+        sa_info[i].tx_payload_info.encOffset =         netTest_MAC_HEADER_LEN +
+                                                                     netTest_IP_HEADER_LEN +
+                                                                    netTest_ESP_HEADER_LEN +
+                                                                    netTest_AES_GMAC_IV_LEN;
+#ifdef EXPERIMENTAL
+        sa_info[i].iv_len=0;
+        sa_info[i].bl=4;
+        sa_info[i].spi = tx_sa[i].spi;
+        sa_info[i].src =*((unsigned int *)(&config.local_ipsec_ip.ipv4[0]));
+        sa_info[i].dst =*((unsigned int *)(&config.remote_ipsec_ip.ipv4[0]));
+#endif
+
+
+        /* dynamic configuration, will  be calculated on the fly */
+        sa_info[i].tx_payload_info.authSize = 0;
+        sa_info[i].tx_payload_info.encSize = 0;
+        //sa_info[i].tx_payload_info.ploadLen = 0;
+        sa_info[i].tx_payload_info.pEncIV = 0;
+        sa_info[i].tx_payload_info.pPkt = 0;
+
+        sa_info[i].cipherMode = NWAL_SA_EALG_NULL;
+        sa_info[i].authMode = NWAL_SA_AALG_GMAC;
+        sa_info[i].inner_ip_offset = sa_info[i].tx_payload_info.encOffset;
+        sa_info[i].auth_tag_size = netTest_AES_GMAC_ICV_LEN;  /* icv or mac size,. always 12 except for AES_CCM/AES_GCM , GMAC*/
+
+        sa_info[i].tx_pkt_info.enetPort = 0;
+        sa_info[i].tx_pkt_info.ipOffBytes = sa_info[i].tx_payload_info.encOffset;
+        sa_info[i].tx_pkt_info.l4HdrLen = netTest_UDP_HEADER_LEN; /*UDP header len */
+        sa_info[i].tx_pkt_info.l4OffBytes = sa_info[i].inner_ip_offset + netTest_IP_HEADER_LEN;
+        sa_info[i].tx_pkt_info.startOffset = 0;
+        sa_info[i].tx_pkt_info.lpbackPass = 0;
+        sa_info[i].tx_pkt_info.ploadLen = 0; /*sa_info[i].tx_pkt_info.l4OffBytes + 4 */
+        sa_info[i].tx_pkt_info.pPkt = NULL;
+        sa_info[i].tx_pkt_info.saOffBytes = netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN;
+        sa_info[i].tx_pkt_info.saPayloadLen = 0;
+        sa_info[i].tx_pkt_info.pseudoHdrChecksum =0;
+       
         sa_info[i].tx_pkt_info.txFlag1 = NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID ;
 
-       trie_insert(p_trie_sa,(char *)&(tx_sa[i].spi),4, (void *) &sa_info[i]); //asociate with tx sa SPI
+        tmp_spi = htonl((long)(tx_sa[i].spi));
+         trie_insert(p_trie_sa,(char *)&tmp_spi,4, (void *) &sa_info[i]); //asociate with tx sa SPI
     }
     else
         printf("build_sa_db(): invalid encryption/authentication combination selected\n");
@@ -2182,7 +2482,7 @@ void  build_sa_db(int i)
         if(strcmp(key, ARG1) == 0) { \
         if(data) strncpy(ARG2,data,CONFIG_STRING_LEN); \
         if(data2) strncpy(ARG3,data2,CONFIG_STRING_LEN); \
-        printf("CHECK_SET_PARM, match found, input cong string %s %s\n", ARG2, ARG3); \
+        printf("CHECK_SET_PARM2, match found, input cong string %s %s\n", ARG2, ARG3); \
         continue; \
         } \
     } while(0)
@@ -2579,7 +2879,7 @@ netcp_cfgCreateMacInterface(
 if (err) {printf("addmac0 failed %d\n",err); exit(1); } 
 
 //attach an IP to this interface
-ip_rule0=netcp_addIp(
+ip_rule0=netcp_cfgAddIp(
                   netapi_handle,
                   0,
                   nwal_IPV4,
@@ -2602,7 +2902,7 @@ netcp_cfgCreateMacInterface(
 if (err) {printf("addmac1 failed %d\n",err); exit(1); }
 
 //attach an IP to this interface
-ip_rule1=netcp_addIp(
+ip_rule1=netcp_cfgAddIp(
                   netapi_handle,
                   1,
                   nwal_IPV4,
index 4500846944c0fb5869de33767cdfc4f695801ea7..74702ed116d5a4e43aff8fb23100ae18196213e6 100755 (executable)
  */
 /* ============================================================= */
 
+
+#define MAX_SEC_INDEX                   6
+
+
 //IPSEC MODE(only choose one rx and one tx)
+#define IPSEC_MODE_RX_INFLOW            1
+#define IPSEC_MODE_TX_INFLOW            2
+#define IPSEC_MODE_RX_SIDEBAND          3
+#define IPSEC_MODE_TX_SIDEBAND          4
 
-#define IPSEC_MODE_RX_INFLOW 1
-#define IPSEC_MODE_TX_INFLOW 2
-#define IPSEC_MODE_RX_SIDEBAND 3
-#define IPSEC_MODE_TX_SIDEBAND 4
 
-#define MAX_SEC_INDEX 4
 #define netTest_MAC_HEADER_LEN          14
 #define netTest_IP_HEADER_LEN           20
 #define netTest_UDP_HEADER_LEN          8
 #define netTest_ESP_HEADER_LEN          8
 #define netTest_AES_CBC_IV_LEN          16
-#define netTest_AES_CTR_IV_CONTEXT_LEN          16
-#define netTest_AES_CTR_IV_PACKET_LEN          8
-#define netTest_3DES_CBC_IV_LEN          8
-#define netTest_NULL_IV_LEN 0
-#define netTest_ICV_LEN          12
-
+#define netTest_AES_CTR_IV_LEN   8
+#define netTest_3DES_CBC_IV_LEN         8
+#define netTest_AES_GCM_IV_LEN          8
+#define netTest_AES_CCM_IV_LEN          8
+#define netTest_AES_GMAC_IV_LEN          8
+#define netTest_NULL_IV_LEN             0
+#define netTest_ICV_LEN                 12
+#define netTest_AES_GCM_CCM_ICV_LEN     16
+#define netTest_AES_GMAC_ICV_LEN     16
 
 
 /* The input strings for the input config file is given below */
-#define INIT_CONFIG_MAC0      "mac0"
-#define INIT_CONFIG_MAC1      "mac1"
-#define INIT_CONFIG_IP0         "ip0"
-#define INIT_CONFIG_IP1         "ip1"
-#define INIT_CONFIG_IP2         "ip2"
-#define INIT_CONFIG_LOCAL_IPSEC_IP         "local_ipsec_ip"
-#define INIT_CONFIG_REMOTE_IPSEC_IP         "remote_ipsec_ip"
+#define INIT_CONFIG_MAC0            "mac0"
+#define INIT_CONFIG_MAC1            "mac1"
+#define INIT_CONFIG_IP0             "ip0"
+#define INIT_CONFIG_IP1             "ip1"
+#define INIT_CONFIG_IP2             "ip2"
+#define INIT_CONFIG_LOCAL_IPSEC_IP  "local_ipsec_ip"
+#define INIT_CONFIG_REMOTE_IPSEC_IP "remote_ipsec_ip"
 #define INIT_CONFIG_IPSEC_MODE_RX   "ipsec_mode_rx"
 #define INIT_CONFIG_IPSEC_MODE_TX   "ipsec_mode_tx"
 #define INIT_CONFIG_IPSEC_IF_NO     "ipsec_if"
@@ -94,6 +100,7 @@ typedef struct {
     uint8_t auth_tag_size;
     nwalTxPktInfo_t tx_pkt_info;
     nwal_saEALG         cipherMode;
+    nwal_saAALG         authMode;
     /*stuff for routing use case */
     unsigned int src;  //BE
     unsigned int dst;  //BE