c2ffbcedd181191eb66eb54623cc93fe1e0062a3
[keystone-rtos/netapi.git] / ti / runtime / netapi / applications / ipsec_offload / ipsecmgr / src / netapilib_interface.c
1 /*
2  * Copyright (C) 2013 Texas Instruments Incorporated - http://www.ti.com/
3  *
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions
7  *  are met:
8  *
9  *    Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  *    Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the
15  *    distribution.
16  *
17  *    Neither the name of Texas Instruments Incorporated nor the names of
18  *    its contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33 */
35 /* Standard includes */
36 #include <stdio.h>
37 #include <arpa/inet.h>
38 #include <inttypes.h>
40 /* ipsecmgr includes */
41 #include <ipsecmgr_snoop.h>
42 #include <ipsecmgr_syslog.h>
44 #include "netapilib_interface.h"
47 extern ipsecMgrMcb_t globalDB;
48 extern NETAPI_T netapi_handle;
49 extern ipsecMgrIfConfigEntry_T ipConfigList[];
53 int compareIPAddr(unsigned char* ip1, unsigned char* ip2, int ip_type)
54 {
55     int found = 1;
56     int i;
57     for (i = 0; i<4; i++)
58     {
59         if (ip1[i] != ip2[i])
60         {
61         found = 0;
62         break;
63         }
64     
65     }
66     return found;
67 }
68 /**************************************************************************
69  * FUNCTION PURPOSE:  Internal function to find a free slot to store APPID
70  *                    in list
71  **************************************************************************
72  * DESCRIPTION:  Internal internal function to find a free slot in SA list for an SA
73  ********************************************************************/
74 int findFreeAppIdSlot(ipsecMgrAppId_T *pList)
75 {
76     int i;
77     for(i=0;i<64;i++)
78     {                       
79         if (!pList[i].in_use)
80         {
81             if (free)
82             pList[i].in_use = 1; //pending
83             return i;
84         }
85     }
86     return -1;
87 }
89 /********************************************************************
90  * FUNCTION PURPOSE:  Internal function to find a SA app id  in SA list
91  *                    and free SA Slot entry if specified
92  ********************************************************************
93  * DESCRIPTION:  Internal function to find a SA app id  in SA list
94  *                    and free SA Slot entry if specified
95  ********************************************************************/
96 int findAppIdSlot(ipsecMgrAppId_T *pList, uint32_t saAppId, int free)
97 {
98     int i;
99     for(i=0;i<64;i++)
100     {                       
101         if ((pList[i].in_use) && (pList[i].saAppId == saAppId))
102         {
103             if(free)
104                 pList[i].in_use = 0;
105             return i;
106         }
107     }
108     return -1;
111 /**************************************************************************
112  * FUNCTION PURPOSE: The function is used to translate the SA configuration
113  * parameters received from the IPSec Snopper and call the NETAPI function
114  * to create a security association
115  ********************************************************************/
116 int netapilib_ifAddSA
118     ipsecmgr_af_t               af,
119     ipsecmgr_sa_id_t            *sa_id,
120     ipsecmgr_sa_info_t          *sa_info,
121     ipsecmgr_sa_dscp_map_cfg_t  *dscp_map_cfg,
122     ipsecmgr_ifname_t           *if_name,
123     ipsecmgr_sa_encap_tmpl_t    *encap,
124     ipsecmgr_fp_handle_t        *sa_handle
127     int i;
128     uint8_t                 auth_key[36];
129     uint8_t                 encr_key[36];
130     int error, index,slot;
131     NETAPI_SEC_SA_INFO_T saInfo;
132     nwalSecKeyParams_t  keyParams;
133     void * p_rx_inflow_mode_handle;
134     void * p_tx_inflow_mode_handle;
135     NETCP_CFG_ROUTE_T  route;
136     NETCP_CFG_FLOW_T flow;
137     NETCP_CFG_SA_HANDLE_T pSaHandle;
138     char* pTok = NULL;
139     int iface;
140     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO, 
141                 "netapilib_ifAddSA:, DEBUG: Translating SA\n");
143     memset((void *)&saInfo, 0, sizeof (NETAPI_SEC_SA_INFO_T));
144     memset((void *)&keyParams, 0, sizeof (nwalSecKeyParams_t));
145     memset((void *)&route, 0, sizeof (NETCP_CFG_ROUTE_T));
146     memset((void *)&flow, 0, sizeof (NETCP_CFG_FLOW_T));
150     /* Initialize the SA Config structure. */
151     /* Get the IP protocol version. */
152     if (af == IPSECMGR_AF_IPV4)
153     {
154         saInfo.ipType = nwal_IPV4;
155         /* Populate the source and destination IP addresses. */
156         for (index = 0; index < 4; index++)
157         {
158             saInfo.dst.ipv4[index] = sa_id->daddr.ipv4[index];
159             saInfo.src.ipv4[index] = sa_info->saddr.ipv4[index];
160         }
161     }
162     else if (af == IPSECMGR_AF_IPV6)
163     { 
164         saInfo.ipType = nwal_IPV6;
166         /* Populate the source and destination IP addresses. */
167         for (index = 0; index < 16; index++)
168         {
169             saInfo.dst.ipv6[index] = sa_id->daddr.ipv6[index];
170             saInfo.src.ipv6[index] = sa_info->saddr.ipv6[index];
171         }
172     }
173     else
174     {
175         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
176             "netapilib_ifAddSA: Address family (%d) is invalid\n", af);
177         return -1;
178     }
179     /* Get the SPI. */
180     saInfo.spi = sa_id->spi;
182     /* Get the SA direction. */
183     if (sa_info->dir == DIR_INBOUND)
184     {
185         slot = findFreeAppIdSlot(&globalDB.rx_sa[0]);
186         if (slot == -1)
187         {
188             ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR, 
189                 "netapilib_ifAddSA:, Too many INBOUND SAs already offloaded\n");
190             return -1;
191         }
192         saInfo.dir = NWAL_SA_DIR_INBOUND;
193         /* need to check which interface this SA will be attached to */
194         for (i=0;i<16;i++)
195         {
196             /* get interface for destination ip address */
197             if (compareIPAddr(&ipConfigList[i].ip[0], 
198                               &saInfo.dst.ipv4[0],
199                               saInfo.ipType))
200             {
201                 printf("netapiplib_ifAddSA: match found, interface: %s\n",
202                     ipConfigList[i].name);
203                 
204                 pTok = strtok(ipConfigList[i].name, ":.");
205                 /* now we have the interface name, is this eth0 or eth1 */
206                 if (pTok)
207                 printf("netapiplib_ifAddSA: match found,after strtok interface: %s\n",
208                     pTok);
209                 /* now we have eth0 or eth1, now find the i/f number */
210                 sscanf(pTok,"eth%d", &iface);
211                 
212                 globalDB.rx_sa[slot].iface = iface;
213                 flow.dma_engine= 1;
214                 flow.flowid = globalDB.flowId[iface];
215                 route.p_flow = &flow;
216                 route.p_dest_q = globalDB.pktio_channel[iface];
217                 break;
218                 
219             }
220         }
221         
222     }
223     else if (sa_info->dir == DIR_OUTBOUND)
224     {
225         slot = findFreeAppIdSlot(&globalDB.tx_sa[0]);
226         if (slot == -1)
227         {
228             ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR, 
229                 "netapilib_ifAddSA:, Too many OUTBOUND SAs already offloaded\n");
230             return -1;
231         }
232         saInfo.dir = NWAL_SA_DIR_OUTBOUND;
233     }
234     else
235     {
236         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
237             "netapilib_ifAddSA: IPSec direction (%d) is invalid\n", sa_info->dir);
238         return -1;
239     }
240     
242     /* Get the replay Window */
243     saInfo.replayWindow = sa_info->replay_window;
244    
245     /* Get the IPSec protocol. */
246     if (sa_id->proto == SA_PROTO_AH)
247         saInfo.proto = nwal_IpSecProtoAH;
248     else if (sa_id->proto == SA_PROTO_ESP)
249         saInfo.proto = nwal_IpSecProtoESP;
250     else
251     {
252         ipsecmgr_syslog_msg(SYSLOG_LEVEL_INFO,
253             "netapilib_ifAddSA: IPSec protocol (%d) is invalid.\n", sa_id->proto);
254         return -1;
255     }
256     /* Get the IPSec mode. */
257     if (sa_info->mode == SA_MODE_TRANSPORT)
258         saInfo.saMode = nwal_SA_MODE_TRANSPORT;
259     else if (sa_info->mode == SA_MODE_TUNNEL)
260         saInfo.saMode = nwal_SA_MODE_TUNNEL;
261     else
262     {
263         ipsecmgr_syslog_msg(SYSLOG_LEVEL_INFO,
264             "netapilib_ifAddSA: IPSec mode (%d) is invalid.\n", sa_info->mode);
265         return -1;
266     }
267     /* Get the authentication mode algorithm. */
268     if (sa_info->auth.algo == SA_AALG_HMAC_SHA1)
269         saInfo.authMode = NWAL_SA_AALG_HMAC_SHA1;
270     else if (sa_info->auth.algo == SA_AALG_HMAC_MD5)
271         saInfo.authMode = NWAL_SA_AALG_HMAC_MD5;
272     else if (sa_info->auth.algo == SA_AALG_NONE || sa_info->auth.algo == SA_AALG_NULL)  
273         saInfo.authMode = NWAL_SA_AALG_NULL;
274     else
275     {
276         ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
277             "netapilib_ifAddSA: Authentication algorithm (%d) is invalid\n", sa_info->auth.algo);
278         return -1;
279     }
281     /* Get the encryption mode algorithm. */
282     if (sa_info->enc.algo == SA_EALG_NULL) 
283         saInfo.cipherMode = NWAL_SA_EALG_NULL;
284     else if (sa_info->enc.algo == SA_EALG_AES_CTR) 
285         saInfo.cipherMode = NWAL_SA_EALG_AES_CTR;
286     else if (sa_info->enc.algo == SA_EALG_AES_CBC)
287         saInfo.cipherMode = NWAL_SA_EALG_AES_CBC;
288     else if (sa_info->enc.algo == SA_EALG_3DES_CBC) 
289         saInfo.cipherMode = NWAL_SA_EALG_3DES_CBC;
290     else if (sa_info->enc.algo == SA_EALG_DES_CBC) 
291         saInfo.cipherMode = NWAL_SA_EALG_DES_CBC;
292     else
293     {
294         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
295             "netapilib_ifAddSA: Encryption algorithm (%d) is invalid\n", sa_info->enc.algo);
296         return -1;
297     }
298     /* Validate the key lengths. */
299     if ((keyParams.macKeySize = sa_info->auth_key_len) > 32)
300     {
301         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
302             "netapilib_ifAddSA: Authentication key size (%d) is invalid.\n", sa_info->auth_key_len);
303         return -1;
304     }
305     if ((keyParams.encKeySize = sa_info->enc_key_len) > 32)
306     {
307         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
308             "netapilib_ifAddSA: Encryption key size (%d) is invalid.\n", sa_info->enc_key_len);
309         return -1;
310     }
312     /* Get the authentication/encryption keys. */
313     keyParams.pAuthKey = &sa_info->auth_key[0];
314     keyParams.pEncKey = &sa_info->enc_key[0];
316     if (saInfo.dir == NWAL_SA_DIR_INBOUND)
317     {
318         /* Inbound == RX */
319         globalDB.rx_sa[slot].saAppId =  netapi_secAddSA(netapi_handle,
320                         NETCP_CFG_NO_INTERFACE,
321                         &saInfo,
322                         &keyParams,
323                         NETAPI_SEC_SA_INFLOW,
324                         (NETCP_CFG_ROUTE_HANDLE_T)&route,
325                         &p_rx_inflow_mode_handle,
326                         &p_tx_inflow_mode_handle,
327                         NULL, &error);
329         if (error == NETAPI_ERR_OK)
330         {
331             *sa_handle = globalDB.rx_sa[slot].saAppId;
332         }
333         else
334         {
335             ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
336                                 "netapilib_ifAddSA: netapi_secAddSA returned error: %d.\n",
337                                  error);
338             return -1;
339         }
340     }
341     else
342     {
343         /* OUTBOUND == TX */
344         globalDB.tx_sa[slot].saAppId = netapi_secAddSA(netapi_handle,
345                         NETCP_CFG_NO_INTERFACE,
346                         &saInfo,
347                         &keyParams,
348                         NETAPI_SEC_SA_INFLOW,
349                         (NETCP_CFG_ROUTE_HANDLE_T)NULL,
350                         &p_rx_inflow_mode_handle,
351                         &p_tx_inflow_mode_handle,
352                         NULL, &error);
353         if (error == NETAPI_ERR_OK)
354         {
355             *sa_handle = globalDB.tx_sa[slot].saAppId;
356 #if 0
357              netapi_secGetChanHandles(netapi_handle,
358                           saAppIdOut,
359                           NULL,
360                           &pSaHandle);
361 #endif
362         }
363         else
364         {
365             ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
366                                 "netapilib_ifAddSA: netapi_secAddSA returned error: %d.\n",
367                                  error);
368             return -1;
369         }
370     }
371     
372     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
373     "netapilib_ifAddSA: Translation of SA successful, app_id: 0x%x\n", *sa_handle);
375     /* SA was created successfully. */
376     return 0;
378 /**************************************************************************
379  * FUNCTION PURPOSE: The function is used to translate the SA configuration
380  * parameters received from the IPSec Snopper and call the NETAPI function
381  * to delete a security association
382  ********************************************************************/
383 int netapilib_ifDeleteSA (ipsecmgr_fp_handle_t sa_handle)
385     int error, slot;
386     
387     slot = findAppIdSlot(&globalDB.rx_sa[0],sa_handle, 1);
389     /* Determine if rx_sa or tx_sa is being deleted */
390     if (slot != -1)
391     {
392         /* found rx SA, see if there is policy assoicated with rx SA
393            if so, then delete it first*/
394         if (globalDB.rx_sa[slot].spAppId)
395         {    
396             netapi_secDelRxPolicy(netapi_handle,
397                               (NETCP_CFG_IPSEC_POLICY_T) globalDB.rx_sa[slot].spAppId,
398                               &error);
399             ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
400                 "netapilib_ifDeleteSA: SP deleted: sp_app_id: 0x%x, slot: %d, error: %d\n", 
401                 globalDB.rx_sa[slot].spAppId, slot, error);
402             netapi_secDelSA(netapi_handle,
403                         NETCP_CFG_NO_INTERFACE,
404                         (NETCP_CFG_SA_T) sa_handle,
405                         &error);
406             ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
407                 "netapilib_ifDeleteSA: SA deleted: sa_app_id: 0x%x, slot: %d, error: %d\n", 
408                 sa_handle, slot, error);
409             
410         }
411     }
412     else
413     {
414         /* not rx SA, check for tx_sa */
415         slot = findAppIdSlot(&globalDB.tx_sa[0], sa_handle, 1);
416     
417         if (slot != -1)
418         {
419             /* found tx SA, delete it now */
420             netapi_secDelSA(netapi_handle,
421                         NETCP_CFG_NO_INTERFACE,
422                         (NETCP_CFG_SA_T) sa_handle,
423                         &error);
424             ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
425                 "netapilib_ifDeleteSA: SA deleted: sa_app_id: 0x%x, slot: %d, error: %d\n", 
426                 sa_handle, slot, error);
427         }
428         else
429         {
430             ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
431             "netapilib_ifDeleteSA: sa_app_id 0x%x not found in internal list\n", 
432                 sa_handle);
433             return -1;
434         }
435     }
437     return error;
440 /**************************************************************************
441  * FUNCTION PURPOSE: The function is used to translate the SP configuration
442  * parameters received from the IPSec Snopper and call the NETAPI function
443  * to create a security policy
444  ********************************************************************/
445 int32_t netapilib_ifAddSP
447     ipsecmgr_af_t           af,
448     ipsecmgr_selector_t     *sel,
449     ipsecmgr_dir_t          dir,
450     uint32_t                reqid,
451     ipsecmgr_fp_handle_t    sa_handle, 
452     ipsecmgr_policy_id_t    policy_id,
453     ipsecmgr_fp_handle_t    *sp_handle
456 #ifdef ENABLE_ADD_POLICY
457     NETCP_CFG_IPSEC_POLICY_T spAppIdIn;
458     int error, index, slot;
459     nwal_IpType ipType;
460     nwalIpAddr_t src_ip_addr;
461     nwalIpAddr_t dst_ip_addr;
462     nwalIpOpt_t ip_qualifiers;
463     NETCP_CFG_SA_T sa =(NETCP_CFG_SA_T)sa_handle;
464     NETCP_CFG_ROUTE_T  route;
465     NETCP_CFG_FLOW_T flow;
466     NETCP_CFG_PA_HANDLE_T pPaHandleOuterIP;
467     NETCP_CFG_PA_HANDLE_T pPaHandleInnerIP;
468     NETCP_CFG_SA_HANDLE_T pSaHandle;
469     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,"netapilib_ifAddSP: called\n");
472     if (dir == DIR_OUTBOUND)
473     {
474         ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
475             "netapilib_ifAddSP: called for outbound SA, no RX policy required\n");
476         return 0;
477     }
478     slot = findAppIdSlot(&globalDB.rx_sa[0],sa_handle, 0);
479     if (slot == -1)
480     {
481         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR, 
482             "netapilib_ifAddSA:, SA app_id not found\n");
483         return -1;
484     }
488     flow.dma_engine= 1;
489     flow.flowid = globalDB.flowId[globalDB.rx_sa[slot].iface];
490     route.p_flow = &flow;
491     route.p_dest_q = globalDB.pktio_channel[globalDB.rx_sa[slot].iface];
494     /* Get the IP protocol version. */
495     if (af == IPSECMGR_AF_IPV4)
496     {
497         ipType = nwal_IPV4;
498         /* Populate the source and destination IP addresses. */
499         for (index = 0; index < 4; index++)
500         {
501             dst_ip_addr.ipv4[index] = sel->daddr.ipv4[index];
502             src_ip_addr.ipv4[index] = sel->saddr.ipv4[index];
503         }
504     }
505     else if (af == IPSECMGR_AF_IPV6)
506     { 
507         ipType = nwal_IPV6;
508         /* Populate the source and destination IP addresses. */
509         for (index = 0; index < 16; index++)
510         {
511             dst_ip_addr.ipv6[index] = sel->daddr.ipv6[index];
512             src_ip_addr.ipv6[index] = sel->saddr.ipv6[index];
513         }
514     }
515     else
516     {
517         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
518             "netapilib_ifAddSP: Address family (%d) is invalid\n", af);
519         return -1;
520     }
522     globalDB.rx_sa[slot].spAppId = netapi_secAddRxPolicy(netapi_handle,
523                                      (NETCP_CFG_SA_T) sa_handle,
524                                      ipType,
525                                      &src_ip_addr,
526                                      &dst_ip_addr,
527                                      NULL,
528                                      (NETCP_CFG_ROUTE_HANDLE_T)&route,
529                                      NULL,
530                                      &error);
532     if (error == NETAPI_ERR_OK)
533     {
534             *sp_handle = globalDB.rx_sa[slot].spAppId;
535     }
536     else
537     {
538         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
539                       "netapilib_ifAddSA: netapi_secAddRxPolicy returned error: %d.\n",
540                        error);
541         return -1;
542         }
543         ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
544     "netapilib_ifAddSA: Translation of SP successful, app_id: 0x%x\n", *sp_handle);
546 #if 0
547     netapi_secGetChanHandles(netapi_handle,
548                           (NETCP_CFG_SA_T)sa_handle,
549                           globalDB.rx_sa[slot].spAppId,
550                           &pPaHandleOuterIP,
551                           &pPaHandleInnerIP,
552                           &pSaHandle);
553 #endif
554 #endif
555     return 0;
558 /**************************************************************************
559  * FUNCTION PURPOSE: The function is used to translate the SP configuration
560  * parameters received from the IPSec Snopper and call the NETAPI function
561  * to delete a security association
562  ********************************************************************/
563 int32_t netapilib_ifDeleteSP
565     ipsecmgr_fp_handle_t    sp_handle,
566     ipsecmgr_policy_id_t    policy_id,
567     ipsecmgr_dir_t          dir
570     /* Security Policy is deleted as part of deleting SA */
571     return 0;
572 #if 0
573     int error =0;
574     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,"netapilib_ifDeleteSP: called\n");
576     if (dir == DIR_OUTBOUND)
577     {
578         ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
579             "netapilib_ifDeleteSP: called for outbound SA, no RX policy to delete\n");
580             return 0;
581     }
582     netapi_secDelRxPolicy(netapi_handle,
583                           (NETCP_CFG_IPSEC_POLICY_T) sp_handle,
584                           &error);
585                           
586     return 0;
587 #endif
590 /**************************************************************************
591  * FUNCTION PURPOSE: The function is used to translate the SA configuration
592  * parameters received from the IPSec Snopper and retrieve SA context
593  * information for SA.
594  *************************************************************************/
595 int netapilib_ifGetSACtx
597     ipsecmgr_fp_handle_t    sa_handle,
598     ipsecmgr_sa_hw_ctx_t*   hw_ctx
601     uint32_t swInfo0 = 0;
602     uint32_t swInfo1 = 0;
603     nwalGlobCxtInfo_t info;
604     nwal_RetValue retVal;
606     memset(&info, 0, sizeof(nwalGlobCxtInfo_t));
607     NETAPI_HANDLE_T * n = (NETAPI_HANDLE_T *) netapi_handle;
608     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,"netapilib_ifGetSACtx: called\n");
611     netapip_netcpCfgGetSaInflowInfo(&netapi_get_global()->nwal_context,
612                                     (NETCP_CFG_SA_T) sa_handle,
613                                     &swInfo0,
614                                     &swInfo1);
616     hw_ctx->swinfo_sz = 2;
617     hw_ctx->swinfo[0] = swInfo0;
618     hw_ctx->swinfo[1] = swInfo1;
620     retVal = nwal_getGlobCxtInfo(((NETAPI_GLOBAL_T*) (n->global))->nwal_context.nwalInstHandle,
621         &info);
622     if (retVal != nwal_OK)
623     {
624         ipsecmgr_syslog_msg (SYSLOG_LEVEL_ERROR,
625             "netapilib_ifGetSACtx: nwal_getGlobCxtInfo returned error: 0x%x\n", retVal);
626         return -1;
627     }
628     hw_ctx->flow_id = info.rxSaPaFlowId;
630     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
631             "netapilib_ifGetSACtx: rxPaSaflowId: 0x%x, rxSaPaflowId: 0x%x\n",
632             info.rxPaSaFlowId,
633             info.rxSaPaFlowId);
634     ipsecmgr_syslog_msg (SYSLOG_LEVEL_INFO,
635             "netapilib_ifGetSACtx: swInfo0: 0x%x, swInfo1: 0x%x, flowId: 0x%x\n",
636             hw_ctx->swinfo[0],
637             hw_ctx->swinfo[1],
638             hw_ctx->flow_id);
640    /* return success */
641     return 0;