Fix for SDOCM00107501:Compilation issues observed when compiling with C++
[keystone-rtos/netapi.git] / ti / runtime / netapi / src / netapi_loc.h
1 /*****************************************
2  * file: netapi_loc.h
3  * purpose:  internal netapi stuff
4  ****************************************/
6 #ifndef __NETAPI_LOC__H
7 #define __NETAPI_LOC__H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
15 #include "ti/drv/nwal/nwal_util.h"
16 #include "ti/runtime/netapi/pktio.h"
17 #include "ti/drv/nwal/nwal.h"
18 #include "ti/drv/nwal/nwal_util.h"
19 #include "ti/runtime/hplib/hplib.h"
22 extern hplib_virtualAddrInfo_T netapi_VM_VirtAddr[HPLIB_MAX_MEM_POOLS];
23 extern unsigned char *netapi_VM_SaContextVaddr;
24 /***********************************************
25  *  GLOBAL AREA
26  *   short term:  this is global to process
27  *         (multi-process not supported)
28  *   long term:  this structure gets put in shared memory 
29  ***********************************************/
31 /* list of global pktio channels that have been created
32    (NETCP_TX, RX are intrinsic so won't be here) */
33 typedef struct PKTIO_ENTRY_tag
34 {
35    char name[PKTIO_MAX_NAME+1];
36    Qmss_Queue qn;         // -1 => slot is free
37 } PKTIO_ENTRY_T;
39 /* to hold an IP on an interface */
40 typedef struct NETCP_INTERFACE_IP_Tag
41 {
42         int in_use;
43         void * nwal_handle;
44         nwal_IpType  ip_type;
45         nwalIpAddr_t  ip_addr;
46         nwalIpOpt_t ip_qualifiers;
47         void * user_data;
48 } NETCP_INTERFACE_IP_T;
50 /* to hold a classifier */
51 typedef struct NETCP_INTERFACE_CLASSIFIER_Tag
52 {
53     int  in_use;
54     int  class_type;   //see netcp_cfg.h
55     void * nwal_L2_handle;
56     void * nwal_L3_handle;
57     void * nwal_L4_handle;
58     void * user_data;
59 } NETCP_INTERFACE_CLASSIFIER_T;
61 /* to hold an ipsec rx policy */
62 typedef struct NETCP_IPSEC_POLICY_Tag
63 {
64     int in_use;
65     int tunnel; //associated tunnel
66     void * nwal_handle;  //handle associated with this RX Policy
67     void * user_data; // user data associtaed with this RX Policy
68 } NETCP_IPSEC_POLICY_T;
70 /* to hold a tunnel */
71 typedef struct NETCP_IPSEC_SA_Tag
72 {
73     int in_use;
74     int inbound;  //true if inbound
75        
76     int  sa_mode;  //mode we are going to use 
77 #define NETCP_IPSEC_SA_MODE_INFLOW 0
78 #define NETCP_IPSEC_SA_MODE_SIDEBAND 1
79  
80     void * sa_handle_inflow;   //for inflow mode
81     void * sa_handle_sideband; //for sideband mode
82     int iface;     //associated interface
83     nwalTxDmPSCmdInfo_t     dmPSCmdInfo;
84     uint32_t    swInfo0;
85     uint32_t    swInfo1;
86     void*   user_data;
87 } NETCP_IPSEC_SA_T;
89 /* to hold a netcp 'interface' */
90 typedef struct NETCP_INTERFACE_Tag
91 {
92    int in_use;  /* 1 for valid */
93    int state;  /* 0=down, 1=up,  future.. */
94    void * nwal_handle;  //handle associated with this interface
95    unsigned char mac[6];  // mac address
96    unsigned int vlan;   //future
97 } NETCP_INTERFACE_T;
99 /*to keep track of netcp config transactions */
100 typedef struct {
101     nwal_Bool_t             inUse;
102     uint16_t                transType;
103 #define NETAPI_NWAL_HANDLE_TRANS_NONE             0
104 #define NETAPI_NWAL_HANDLE_TRANS_MAC              1
105 #define NETAPI_NWAL_HANDLE_TRANS_IP               2
106 #define NETAPI_NWAL_HANDLE_TRANS_PORT             3
107 #define NETAPI_NWAL_HANDLE_TRANS_SA               4
108 #define NETAPI_NWAL_HANDLE_TRANS_SA_POLICY        5
109 #define NETAPI_NWAL_HANDLE_STAT_REQUEST           6
111     uint16_t                state;
112 #define NETAPI_NWAL_HANDLE_STATE_IDLE             0
113 #define NETAPI_NWAL_HANDLE_STATE_OPEN_PENDING     1
114 #define NETAPI_NWAL_HANDLE_STATE_OPEN             2
115 #define NETAPI_NWAL_HANDLE_STATE_CLOSE_PENDING    3
116 #define NETAPI_NWAL_HANDLE_STATE_ERR                        4
117     nwal_Handle             handle;
118     uint64_t                transId;
119     NETAPI_T                netapi_handle; //the thread making the transaction
120 }  NetapiNwalTransInfo_t;
122 /* to hold user defined flows */
123 typedef struct NETCP_REGISTERED_FLOWS_Tag
125     int                 in_use;  //1=> in use
126     void*               handle; //cppi handle to resource (internal)
127     NETCP_CFG_FLOW_T    flow;
128 } NETCP_REGISTERED_FLOWS_T;
130 /******************************
131  *    nwal global context : for SOC
132  *  (shared over all process instances)
133  *******************************/
134 typedef struct
136     int                             state;
137 #define NETAPI_NW_CXT_GLOB_INACTIVE               0x0
138 #define NETAPI__CXT_GLOB_ACTIVE                   0x1
139 #define NETAPI_NW_CXT_GLOB_RES_ALLOC_COMPLETE     0x3
141     nwal_Handle                     nwalInstHandle;  //created instance 
142     //internal heaps used just by netcp (sa<->pa). SW doesn't touch these
143     Pktlib_HeapHandle               sa2pa_heap;
144     Pktlib_HeapHandle               pa2sa_heap;
145     //stats
146     paSysStats_t                    paStats;
147     NETCP_INTERFACE_T               interfaces[TUNE_NETAPI_MAX_NUM_MAC];        //interfaces
148     NETCP_INTERFACE_CLASSIFIER_T    classi[TUNE_NETAPI_MAX_CLASSIFIERS]; //classifiers
149     NETCP_REGISTERED_FLOWS_T        flows[TUNE_NETAPI_MAX_FLOWS]; //flows
150     NETCP_IPSEC_SA_T                tunnel[TUNE_NETAPI_MAX_SA];           //tunnels
151     NETCP_IPSEC_POLICY_T            policy[TUNE_NETAPI_MAX_POLICY];  //policies
152     NETCP_INTERFACE_IP_T            ips[TUNE_NETAPI_MAX_NUM_IP];           //ips
153 } NETAPI_NWAL_GLOBAL_CONTEXT_T;
154 /************************************/
155 /* global instance for this process */
156 /************************************/
157 typedef struct
159     int                             state; /* see above*/
160     int                             numCmdPass;
161     int                             numCmdFail;
162     int                             numBogusTransIds;
163     NetapiNwalTransInfo_t           transInfos[TUNE_NETAPI_MAX_NUM_TRANS]; 
164 } NETAPI_NWAL_GLOBAL_PROC_CONTEXT_T;
166 /* NWAL Local context (per core/thread)  */
167 typedef struct
169 #define NETAPI_NW_CXT_LOC_INACTIVE     0x0
170 #define NETAPI_NW_CXT_LOC_ACTIVE       0x2
171     int                     state;
173     int                     numPendingCfg;
174     NETCP_CFG_STATS_CB      stats_cb;
176 /* stats */
177     int                     numL2PktsRecvd;
178     int                     numL3PktsRecvd;
179     int                     numL4PktsRecvd;
180     int                     numL4PktsSent;
181     int                     TxErrDrop;
183     /* local config */
184     nwalLocCfg_t           nwalLocCfg;
185 } NETAPI_NWAL_LOCAL_CONTEXT_T;
187 /* the global: for SOC, accross all processes */
188 typedef struct NETAPI_GLOBAL_tag
190 #define NETAPI_MAX_PKTIO (TUNE_NETAPI_MAX_PKTIO) 
191     PKTIO_ENTRY_T                   pktios[NETAPI_MAX_PKTIO];
192     /* configuration */
193     NETAPI_CFG_T                    cfg;
194     /* nwal context */
195     NETAPI_NWAL_GLOBAL_CONTEXT_T    nwal_context;
196     //NETAPI_T                        p_master;  // save p'masters handle 
197 } NETAPI_GLOBAL_T;
199 /* the process global: one per process */
200 typedef struct NETAPI_PROC_GLOBAL_tag
202     /* nwal context */
203     NETAPI_NWAL_GLOBAL_PROC_CONTEXT_T    nwal_context;
205     //NETAPI_T                        p_master;  // save p'masters handle 
206 } NETAPI_PROC_GLOBAL_T;
207 /************************************
208  * this is a per thread structure.
209  * It contains stuff local to thread
210  *  and pointer to global stuff
211  *  that is shared over all threads,
212  **************************************/
213 typedef struct NETAPI_HANDLE_Tag
215     int                         master; //master type
217     void*                       global;  /* pointer to the soc global area */
218     void*                       proc_global;  /* pointer to the proc global area */
220     /* heap  handles */
221     Pktlib_HeapHandle           netcp_heap;    /* internal default */
222     Pktlib_HeapHandle           netcp_control_rx_heap; /* for control messages */
223     Pktlib_HeapHandle           netcp_control_tx_heap; /* for control messages */
224     Pktlib_HeapHandle           createdHeaps[TUNE_NETAPI_MAX_HEAPS];  /* created by app and registered */
226     /* pktios defined */
227     int                         n_pktios; /* #of pktios that are active for this instance */
228     void*                       pktios[NETAPI_MAX_PKTIO]; /* the list of pktios */
230     /* scheduler stuff.  unallocated if NETAPI_INCLUDE_SCHED not set */
231     void*                       p_sched;
233     /* nwal local context */
234     NETAPI_NWAL_LOCAL_CONTEXT_T nwal_local;
236     /* thread cookie */
237     void*                       cookie;  /*set by calling thread */
238     HPLIB_SPINLOCK_IF_T        spinLock;
239 } NETAPI_HANDLE_T;
241 typedef struct NETAPI_SHM_Tag
243     NETAPI_GLOBAL_T     netapi_global;
244     hplib_spinLock_T    netapi_pktio_lock;
245     hplib_spinLock_T    netapi_netcp_cfg_lock;
246     hplib_spinLock_T    netapi_util_lock;
247     hplib_spinLock_T    netapi_netcp_cfg_l3_classi_lock;
248 } NETAPI_SHM_T;
250 //internal initialization routines */
251 int netapip_initQm(int max_descriptors);
252 int netapip_initCppi(void);
253 int netapip_startQm(void);
254 int netapip_initNwal(int region2use,
255                      Pktlib_HeapIfTable * p_table,
256                      NETAPI_NWAL_GLOBAL_CONTEXT_T * p_nwal_context,
257                      NETAPI_CFG_T *p_cfg );
259 int netapip_startNwal(Pktlib_HeapHandle             pkt_heap,
260                       Pktlib_HeapHandle             cmd_heapRx,
261                       Pktlib_HeapHandle             cmd_heapTx,
262                       NETAPI_NWAL_LOCAL_CONTEXT_T*  p,
263                       NETAPI_CFG_T*                 p_cfg,
264                       NETAPI_NWAL_GLOBAL_CONTEXT_T* p_nwal_glob_context );
266 int netapip_initTimer(void);
267 int netapip_qmSetupMemRegion(unsigned int          numDesc,
268                              unsigned int          descSize,
269                              unsigned int*         pDescMemBase,
270                              int                   memRegion);
272 #define NETAPI_GLOBAL_REGION TUNE_NETAPI_QM_GLOBAL_REGION 
273 #define NETAPI_LOCAL_REGION ((NETAPI_GLOBAL_REGION)+1) 
276 //nwal callbacks
277 void netapip_pktioNWALRxPktCallback(uint32_t          appCookie,
278                                     uint16_t          numPkts,
279                                     nwalRxPktInfo_t*  pPktInfo,
280                                     uint64_t          timestamp,
281                                     nwal_Bool_t*      pFreePkt);
283 void netapip_netcpCfgNWALCmdCallBack (nwal_AppId        appHandle,
284                                       uint16_t          trans_id,
285                                       nwal_RetValue     ret);
287 void netapip_netcpCfgNWALCmdPaStatsReply (nwal_AppId        appHandle,
288                                           nwal_TransID_t    trans_id,
289                                           paSysStats_t      *stats);
291 void netapip_pktioNWALSBPktCallback     (uint32_t                   appCookie,
292                                          uint16_t                   numPkts,
293                                          nwalDmRxPayloadInfo_t*     pDmRxPktInfo,
294                                         nwal_Bool_t*                pFreePkt);
297 //***********************************
298 //internal utilities
299 //*************************************
301 //return the list of pktios for this instance
302 static inline void ** netapi_get_pktio_list(NETAPI_T p)
304 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
305 return &pp->pktios[0];
308 //get scheduler block handle
309 static inline void * netapi_get_scheduler(NETAPI_T p)
311     NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
312     return pp->p_sched;
315 /* return pointer to global area */
316 NETAPI_GLOBAL_T * netapi_get_global(void);
317 NETAPI_PROC_GLOBAL_T * netapi_get_proc_global(void);
319 //add a pktio name (and queue) to global list
320 static inline int  netapip_addGlobalPktio(NETAPI_T p, char *name, Qmss_Queue * qn)
322 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
323 PKTIO_ENTRY_T *pe;
324 int i;
325 //find a free slot
326 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];
328 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)
329  {
330    if (pe->qn.qNum ==  -1)
331    {
332      pe->qn.qNum=qn->qNum;
333      pe->qn.qMgr=qn->qMgr;
334      strncpy(pe->name, name, PKTIO_MAX_NAME);
335      return 1;
336    }
337    pe+=1;
338  }
339  return 0;  //no room
342 //delete a pktio name (and queue) to global list
343 static inline int  netapi_del_global_pktio(NETAPI_T p, char *name)
345 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
346 PKTIO_ENTRY_T *pe;
347 int i;
348 //find slot
349 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];
351 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)
352  {
353    if (pe->qn.qNum == -1) continue;
354    if (!strncmp(name, pe->name, PKTIO_MAX_NAME))
355    {
356      pe->qn.qNum=-1;
357      pe->name[0]='\0';
358      return 1;
359    }
360    pe+=1;
361  }
362  return 0;  //no room
366 /* get list of global pktios that have been created */
367 static inline  Qmss_Queue*  netapip_findGlobalPktio(NETAPI_T p, char *name)
369 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
370 PKTIO_ENTRY_T *pe;
371 int i;
372 //find slot
373 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];
375 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)
376  {
377    if (pe->qn.qNum  == -1) continue;
378    if (!strncmp(name, pe->name, PKTIO_MAX_NAME))
379    {
380      return &pe->qn;
381    }
382    pe +=1;
383  }
384  return NULL;  //not found
387 /* return the nwal global instance handle */
388 static inline nwal_Handle netapip_returnNwalInstanceHandle(NETAPI_T p)
391 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
392 return ((NETAPI_GLOBAL_T *)(pp->global))->nwal_context.nwalInstHandle;
397 //utility to clear out a queue
398 void netapip_zapQ(int queueNum);
399 void netapip_netcpCfgBuildRoute(NETCP_CFG_ROUTE_T * p_route,
400                                 int16_t * p_flow,
401                                 Qmss_QueueHnd * p_q,
402                                 nwalRouteType_t *p_type);
404 //database utilities
405 void netapip_netcpCfgDeleteSa(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,int sa_slot);
407 void netapip_netcpCfgInsertSa(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
408                           int sa_slot,  //we 'reserved it already'
409                           int dir,
410                           int mode,
411                           void * temp1,
412                           void * temp2,
413                           void * handle_inflow,
414                           void * handle_sideband,
415                           nwalTxDmPSCmdInfo_t *dmPSCmdInfo,
416                           uint32_t swInfo0,
417                           uint32_t swInfo1,
418                           void* user_data);
420 void *netapip_netcpCfgGetSaHandles( NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
421                           int sa_slot, void ** p_sideband);
422 void* netapip_netcpCfgGetMacHandle(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,int iface_no);
423 NetapiNwalTransInfo_t *  netapip_getFreeTransInfo(NETAPI_HANDLE_T *p_handle,
424                                                   NETAPI_PROC_GLOBAL_T *p_global,
425                                                   nwal_TransID_t *pTransId);
426 void netapip_freeTransInfo(NetapiNwalTransInfo_t* pTransInfo);
427 void *netapip_netcpCfgGetPolicy( NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
428                           int policy_slot);
429 nwalTxDmPSCmdInfo_t* netapip_netcpCfgGetSaSBInfo(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
430                                       NETCP_CFG_SA_T    sa_app_id);
431 int netapip_netcpCfgGetSaInflowInfo(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
432                                       NETCP_CFG_SA_T    sa_app_id,
433                                       uint32_t *swInfo0,
434                                       uint32_t *swInfo1);
436 int netapip_systemInit(NETAPI_HANDLE_T *, Bool);
437 void netapip_cleanupAtStart(void);
442 #ifdef __cplusplus
444 #endif
446 #endif