Changes to compile with devkit
[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
10 //#include "ti/runtime/netapi/netapi.h"
11 #include "ti/drv/nwal/nwal_util.h"
12 #include "ti/runtime/netapi/pktio.h"
13 #include "ti/drv/nwal/nwal.h"
14 #include "ti/drv/nwal/nwal_util.h"
18 extern hplib_virtualAddrInfo_T netapi_VM_VirtAddr[HPLIB_MAX_MEM_POOLS];
19 extern unsigned char *netapi_VM_SaContextVaddr;
20 /***********************************************
21  *  GLOBAL AREA
22  *   short term:  this is global to process
23  *         (multi-process not supported)
24  *   long term:  this structure gets put in shared memory 
25  ***********************************************/
27 /* list of global pktio channels that have been created
28    (NETCP_TX, RX are intrinsic so won't be here) */
29 typedef struct PKTIO_ENTRY_tag
30 {
31    char name[PKTIO_MAX_NAME+1];
32    Qmss_Queue qn;         // -1 => slot is free
33 } PKTIO_ENTRY_T;
35 /* to hold an IP on an interface */
36 typedef struct NETCP_INTERFACE_IP_Tag
37 {
38         int in_use;
39         void * nwal_handle;
40         nwal_IpType  ip_type;
41         nwalIpAddr_t  ip_addr;
42         nwalIpOpt_t ip_qualifiers;
43         void * user_data;
44 } NETCP_INTERFACE_IP_T;
46 /* to hold a classifier */
47 typedef struct NETCP_INTERFACE_CLASSIFIER_Tag
48 {
49     int  in_use;
50     int  class_type;   //see netcp_cfg.h
51     void * nwal_L2_handle;
52     void * nwal_L3_handle;
53     void * nwal_L4_handle;
54     void * user_data;
55 } NETCP_INTERFACE_CLASSIFIER_T;
57 /* to hold an ipsec rx policy */
58 typedef struct NETCP_IPSEC_POLICY_Tag
59 {
60     int in_use;
61     int tunnel; //associated tunnel
62     void * nwal_handle;  //handle associated with this RX Policy
63     void * user_data; // user data associtaed with this RX Policy
64 } NETCP_IPSEC_POLICY_T;
66 /* to hold a tunnel */
67 typedef struct NETCP_IPSEC_SA_Tag
68 {
69     int in_use;
70     int inbound;  //true if inbound
71        
72     int  sa_mode;  //mode we are going to use 
73 #define NETCP_IPSEC_SA_MODE_INFLOW 0
74 #define NETCP_IPSEC_SA_MODE_SIDEBAND 1
75  
76     void * sa_handle_inflow;   //for inflow mode
77     void * sa_handle_sideband; //for sideband mode
78     int iface;     //associated interface
79     nwalTxDmPSCmdInfo_t     dmPSCmdInfo;
80     uint32_t    swInfo0;
81     uint32_t    swInfo1;
82     void*   user_data;
83 } NETCP_IPSEC_SA_T;
85 /* to hold a netcp 'interface' */
86 typedef struct NETCP_INTERFACE_Tag
87 {
88    int in_use;  /* 1 for valid */
89    int state;  /* 0=down, 1=up,  future.. */
90    void * nwal_handle;  //handle associated with this interface
91    unsigned char mac[6];  // mac address
92    unsigned int vlan;   //future
93 } NETCP_INTERFACE_T;
95 /*to keep track of netcp config transactions */
96 typedef struct {
97     nwal_Bool_t             inUse;
98     uint16_t                transType;
99 #define NETAPI_NWAL_HANDLE_TRANS_NONE             0
100 #define NETAPI_NWAL_HANDLE_TRANS_MAC              1
101 #define NETAPI_NWAL_HANDLE_TRANS_IP               2
102 #define NETAPI_NWAL_HANDLE_TRANS_PORT             3
103 #define NETAPI_NWAL_HANDLE_TRANS_SA               4
104 #define NETAPI_NWAL_HANDLE_TRANS_SA_POLICY        5
105 #define NETAPI_NWAL_HANDLE_STAT_REQUEST           6
107     uint16_t                state;
108 #define NETAPI_NWAL_HANDLE_STATE_IDLE             0
109 #define NETAPI_NWAL_HANDLE_STATE_OPEN_PENDING     1
110 #define NETAPI_NWAL_HANDLE_STATE_OPEN             2
111 #define NETAPI_NWAL_HANDLE_STATE_CLOSE_PENDING    3
112 #define NETAPI_NWAL_HANDLE_STATE_ERR                        4
113     nwal_Handle             handle;
114     uint64_t                transId;
115     NETAPI_T                netapi_handle; //the thread making the transaction
116 }  NetapiNwalTransInfo_t;
118 /* to hold user defined flows */
119 typedef struct NETCP_REGISTERED_FLOWS_Tag
121     int                 in_use;  //1=> in use
122     void*               handle; //cppi handle to resource (internal)
123     NETCP_CFG_FLOW_T    flow;
124 } NETCP_REGISTERED_FLOWS_T;
126 /******************************
127  *    nwal global context 
128  *  (shared over all instances)
129  *******************************/
130 typedef struct
132     int                             state;
133 #define NETAPI_NW_CXT_GLOB_INACTIVE               0x0
134 #define NETAPI__CXT_GLOB_ACTIVE                   0x1
135 #define NETAPI_NW_CXT_GLOB_RES_ALLOC_COMPLETE     0x3
137     nwal_Handle                     nwalInstHandle;
138     //internal heaps used just by netcp (sa<->pa). SW doesn't touch these
139     Pktlib_HeapHandle               sa2pa_heap;
140     Pktlib_HeapHandle               pa2sa_heap;
141     //stats
142     paSysStats_t                    paStats;
143     int                             numCmdPass;
144     int                             numCmdFail;
145     int                             numBogusTransIds;
146     NetapiNwalTransInfo_t           transInfos[TUNE_NETAPI_MAX_NUM_TRANS];     //transactions
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;
155 /* NWAL Local context (per core/thread)  */
156 typedef struct
158 #define NETAPI_NW_CXT_LOC_INACTIVE     0x0
159 #define NETAPI_NW_CXT_LOC_ACTIVE       0x2
160     int                     state;
162     int                     numPendingCfg;
163     NETCP_CFG_STATS_CB      stats_cb;
165 /* stats */
166     int                     numL2PktsRecvd;
167     int                     numL3PktsRecvd;
168     int                     numL4PktsRecvd;
169     int                     numL4PktsSent;
170     int                     TxErrDrop;
172     /* local config */
173     nwalLocCfg_t           nwalLocCfg;
174 } NETAPI_NWAL_LOCAL_CONTEXT_T;
176 /* the global */
177 typedef struct NETAPI_GLOBAL_tag
179 #define NETAPI_MAX_PKTIO (TUNE_NETAPI_MAX_PKTIO) 
180     PKTIO_ENTRY_T                   pktios[NETAPI_MAX_PKTIO];
181     /* configuration */
182     NETAPI_CFG_T                    cfg;
183     /* nwal context */
184     NETAPI_NWAL_GLOBAL_CONTEXT_T    nwal_context;
185     NETAPI_T                        p_master;  // save p'masters handle 
186 } NETAPI_GLOBAL_T;
189 /************************************
190  * this is a per thread structure.
191  * It contains stuff local to thread
192  *  and pointer to global stuff
193  *  that is shared over all threads,
194  **************************************/
195 typedef struct NETAPI_HANDLE_Tag
197     int                         master; //master type
199     void*                       global;  /* pointer to the global area */
201     /* heap  handles */
202     Pktlib_HeapHandle           netcp_heap;    /* internal default */
203     Pktlib_HeapHandle           netcp_control_rx_heap; /* for control messages */
204     Pktlib_HeapHandle           netcp_control_tx_heap; /* for control messages */
205     Pktlib_HeapHandle           createdHeaps[TUNE_NETAPI_MAX_HEAPS];  /* created by app and registered */
207     /* pktios defined */
208     int                         n_pktios; /* #of pktios that are active for this instance */
209     void*                       pktios[NETAPI_MAX_PKTIO]; /* the list of pktios */
211     /* scheduler stuff.  unallocated if NETAPI_INCLUDE_SCHED not set */
212     void*                       p_sched;
214     /* nwal local context */
215     NETAPI_NWAL_LOCAL_CONTEXT_T nwal_local;
217     /* thread cookie */
218     void*                       cookie;  /*set by calling thread */
219 } NETAPI_HANDLE_T;
221 //internal initialization routines */
222 int netapip_initQm(int max_descriptors);
223 int netapip_initCppi(void);
224 int netapip_startQm(void);
225 int netapip_initNwal(int region2use,
226                      Pktlib_HeapIfTable * p_table,
227                      NETAPI_NWAL_GLOBAL_CONTEXT_T * p_nwal_context,
228                      NETAPI_CFG_T *p_cfg );
230 int netapip_startNwal(Pktlib_HeapHandle             pkt_heap,
231                       Pktlib_HeapHandle             cmd_heapRx,
232                       Pktlib_HeapHandle             cmd_heapTx,
233                       NETAPI_NWAL_LOCAL_CONTEXT_T*  p,
234                       NETAPI_CFG_T*                 p_cfg,
235                       NETAPI_NWAL_GLOBAL_CONTEXT_T* p_nwal_glob_context );
237 int netapip_initTimer(void);
238 int netapip_qmSetupMemRegion(unsigned int          numDesc,
239                              unsigned int          descSize,
240                              unsigned int*         pDescMemBase,
241                              int                   memRegion);
243 #define NETAPI_GLOBAL_REGION TUNE_NETAPI_QM_GLOBAL_REGION 
244 #define NETAPI_LOCAL_REGION ((NETAPI_GLOBAL_REGION)+1) 
247 //nwal callbacks
248 void netapip_pktioNWALRxPktCallback(uint32_t          appCookie,
249                                     uint16_t          numPkts,
250                                     nwalRxPktInfo_t*  pPktInfo,
251                                     uint64_t          timestamp,
252                                     nwal_Bool_t*      pFreePkt);
254 void netapip_netcpCfgNWALCmdCallBack (nwal_AppId        appHandle,
255                                       uint16_t          trans_id,
256                                       nwal_RetValue     ret);
258 void netapip_netcpCfgNWALCmdPaStatsReply (nwal_AppId        appHandle,
259                                           nwal_TransID_t    trans_id,
260                                           paSysStats_t      *stats);
262 void netapip_pktioNWALSBPktCallback     (uint32_t                   appCookie,
263                                          uint16_t                   numPkts,
264                                          nwalDmRxPayloadInfo_t*     pDmRxPktInfo,
265                                         nwal_Bool_t*                pFreePkt);
268 //***********************************
269 //internal utilities
270 //*************************************
272 //return the list of pktios for this instance
273 static inline void ** netapi_get_pktio_list(NETAPI_T p)
275 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
276 return &pp->pktios[0];
279 //get scheduler block handle
280 static inline void * netapi_get_scheduler(NETAPI_T p)
282     NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
283     return pp->p_sched;
286 /* return pointer to global area */
287 NETAPI_GLOBAL_T * netapi_get_global(void);
289 //add a pktio name (and queue) to global list
290 static inline int  netapip_addGlobalPktio(NETAPI_T p, char *name, Qmss_Queue * qn)
292 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
293 PKTIO_ENTRY_T *pe;
294 int i;
295 //find a free slot
296 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];
298 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)
299  {
300    if (pe->qn.qNum ==  -1)
301    {
302      pe->qn.qNum=qn->qNum;
303      pe->qn.qMgr=qn->qMgr;
304      strncpy(pe->name, name, PKTIO_MAX_NAME);
305      return 1;
306    }
307    pe+=1;
308  }
309  return 0;  //no room
312 //delete a pktio name (and queue) to global list
313 static inline int  netapi_del_global_pktio(NETAPI_T p, char *name)
315 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
316 PKTIO_ENTRY_T *pe;
317 int i;
318 //find slot
319 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];
321 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)
322  {
323    if (pe->qn.qNum == -1) continue;
324    if (!strncmp(name, pe->name, PKTIO_MAX_NAME))
325    {
326      pe->qn.qNum=-1;
327      pe->name[0]='\0';
328      return 1;
329    }
330    pe+=1;
331  }
332  return 0;  //no room
336 /* get list of global pktios that have been created */
337 static inline  Qmss_Queue*  netapip_findGlobalPktio(NETAPI_T p, char *name)
339 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
340 PKTIO_ENTRY_T *pe;
341 int i;
342 //find slot
343 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];
345 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)
346  {
347    if (pe->qn.qNum  == -1) continue;
348    if (!strncmp(name, pe->name, PKTIO_MAX_NAME))
349    {
350      return &pe->qn;
351    }
352    pe +=1;
353  }
354  return NULL;  //not found
357 /* return the nwal global instance handle */
358 static inline nwal_Handle netapip_returnNwalInstanceHandle(NETAPI_T p)
361 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;
362 return ((NETAPI_GLOBAL_T *)(pp->global))->nwal_context.nwalInstHandle;
367 //utility to clear out a queue
368 void netapip_zapQ(int queueNum);
369 void netapip_netcpCfgBuildRoute(NETCP_CFG_ROUTE_T * p_route, int16_t * p_flow,  Qmss_QueueHnd * p_q);
371 //database utilities
372 void netapip_netcpCfgDeleteSa(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,int sa_slot);
373 void netapip_netcpCfgInsertSa(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
374                           int sa_slot,  //we 'reserved it already'
375                           int dir,
376                           int mode,
377                           void * temp1,
378                           void * temp2,
379                           void * handle_inflow,
380                           void * handle_sideband,
381                           nwalTxDmPSCmdInfo_t *dmPSCmdInfo;);
382 void *netapip_netcpCfgGetSaHandles( NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
383                           int sa_slot, void ** p_sideband);
384 void* netapip_netcpCfgGetMacHandle(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,int iface_no);
385 NetapiNwalTransInfo_t *  netapip_getFreeTransInfo(NETAPI_GLOBAL_T *p_global, nwal_TransID_t *pTransId);
386 void netapip_freeTransInfo(NetapiNwalTransInfo_t* pTransInfo);
387 void *netapip_netcpCfgGetPolicy( NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
388                           int policy_slot);
389 nwalTxDmPSCmdInfo_t* netapip_netcpCfgGetSaSBInfo(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
390                                       NETCP_CFG_SA_T    sa_app_id);
391 int netapip_netcpCfgGetSaInflowInfo(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,
392                                       NETCP_CFG_SA_T    sa_app_id,
393                                       uint32_t *swInfo0,
394                                       uint32_t *swInfo1);
396 int netapip_systemInit(NETAPI_HANDLE_T *);
397 void netapip_cleanupAtStart(void);
398 #endif