1 /*****************************************\r
2 * file: netapi_loc.h\r
3 * purpose: internal netapi stuff\r
4 ****************************************/\r
5 \r
6 #ifndef __NETAPI_LOC__H\r
7 #define __NETAPI_LOC__H\r
8 /***************************************\r
9 * INTERNAL HANDLE STRUCTURE DEFINITION\r
10 ****************************************/\r
11 \r
12 /***********************************************\r
13 * GLOBAL AREA\r
14 * short term: this is global to process\r
15 * (multi-process not supported)\r
16 * long term: this structure gets put in shared memory \r
17 ***********************************************/\r
18 \r
19 /* list of global pktio channels that have been created\r
20 (NETCP_TX, RX are intrinsic so won't be here) */\r
21 typedef struct PKTIO_ENTRY_tag\r
22 {\r
23 char name[PKTIO_MAX_NAME+1];\r
24 Qmss_Queue qn; // -1 => slot is free\r
25 } PKTIO_ENTRY_T;\r
26 \r
27 /* to hold an IP on an interface */\r
28 typedef struct NETCP_INTERFACE_IP_Tag\r
29 {\r
30 int in_use;\r
31 void * nwal_handle;\r
32 nwal_IpType ip_type;\r
33 nwalIpAddr_t ip_addr;\r
34 nwalIpOpt_t ip_qualifiers;\r
35 } NETCP_INTERFACE_IP_T;\r
36 \r
37 /* to hold a classifier */\r
38 typedef struct NETCP_INTERFACE_CLASSIFIER_Tag\r
39 {\r
40 int in_use;\r
41 int class_type; //see netcp_cfg.h\r
42 void * nwal_L2_handle;\r
43 void * nwal_L3_handle;\r
44 void * nwal_L4_handle;\r
45 } NETCP_INTERFACE_CLASSIFIER_T;\r
46 \r
47 /* to hold an ipsec rx policy */\r
48 typedef struct NETCP_IPSEC_POLICY_Tag\r
49 {\r
50 int in_use;\r
51 int tunnel; //associated tunnel\r
52 void * nwal_handle; //handle associated with this RX Policy \r
53 } NETCP_IPSEC_POLICY_T;\r
54 \r
55 /* to hold a tunnel */\r
56 typedef struct NETCP_IPSEC_SA_Tag\r
57 {\r
58 int in_use;\r
59 int inbound; //true if inbound\r
60 \r
61 int sa_mode; //mode we are going to use \r
62 #define NETCP_IPSEC_SA_MODE_INFLOW 0\r
63 #define NETCP_IPSEC_SA_MODE_SIDEBAND 1\r
64 \r
65 void * sa_handle_inflow; //for inflow mode\r
66 void * sa_handle_sideband; //for sideband mode\r
67 int iface; //associated interface\r
68 } NETCP_IPSEC_SA_T;\r
69 \r
70 /* to hold a netcp 'interface' */\r
71 typedef struct NETCP_INTERFACE_Tag\r
72 {\r
73 int in_use; /* 1 for valid */\r
74 int state; /* 0=down, 1=up, future.. */\r
75 void * nwal_handle; //handle associated with this interface\r
76 unsigned char mac[6]; // mac address\r
77 unsigned int vlan; //future\r
78 } NETCP_INTERFACE_T;\r
79 \r
80 /*to keep track of netcp config transactions */\r
81 typedef struct {\r
82 nwal_Bool_t inUse;\r
83 uint16_t transType;\r
84 #define NETAPI_NWAL_HANDLE_TRANS_NONE 0\r
85 #define NETAPI_NWAL_HANDLE_TRANS_MAC 1\r
86 #define NETAPI_NWAL_HANDLE_TRANS_IP 2\r
87 #define NETAPI_NWAL_HANDLE_TRANS_PORT 3\r
88 #define NETAPI_NWAL_HANDLE_TRANS_SA 4\r
89 #define NETAPI_NWAL_HANDLE_TRANS_SA_POLICY 5\r
90 #define NETAPI_NWAL_HANDLE_STAT_REQUEST 6\r
91 \r
92 uint16_t state;\r
93 #define NETAPI_NWAL_HANDLE_STATE_IDLE 0\r
94 #define NETAPI_NWAL_HANDLE_STATE_OPEN_PENDING 1\r
95 #define NETAPI_NWAL_HANDLE_STATE_OPEN 2\r
96 #define NETAPI_NWAL_HANDLE_STATE_CLOSE_PENDING 3\r
97 nwal_Handle handle;\r
98 uint64_t transId;\r
99 NETAPI_T netapi_handle; //the thread making the transaction\r
100 } NetapiNwalTransInfo_t;\r
101 \r
102 /* to hold user defined flows */\r
103 typedef struct NETCP_REGISTERED_FLOWS_Tag\r
104 {\r
105 int in_use; //1=> in use\r
106 void * handle; //cppi handle to resource (internal)\r
107 NETCP_CFG_FLOW_T flow;\r
108 } NETCP_REGISTERED_FLOWS_T;\r
109 \r
110 /******************************\r
111 * nwal global context \r
112 * (shared over all instances)\r
113 *******************************/\r
114 typedef struct\r
115 {\r
116 int state;\r
117 #define NETAPI_NW_CXT_GLOB_INACTIVE 0x0\r
118 #define NETAPI__CXT_GLOB_ACTIVE 0x1\r
119 #define NETAPI_NW_CXT_GLOB_RES_ALLOC_COMPLETE 0x3\r
120 \r
121 nwal_Handle nwalInstHandle;\r
122 //internal heaps used just by netcp (sa<->pa). SW doesn't touch these\r
123 Pktlib_HeapHandle sa2pa_heap;\r
124 Pktlib_HeapHandle pa2sa_heap;\r
125 //stats\r
126 paSysStats_t paStats;\r
127 int numCmdPass;\r
128 int numCmdFail;\r
129 int numBogusTransIds;\r
130 NetapiNwalTransInfo_t transInfos[TUNE_NETAPI_MAX_NUM_TRANS]; //transactions\r
131 NETCP_INTERFACE_T interfaces[TUNE_NETAPI_MAX_INTERFACES]; //interfaces\r
132 NETCP_INTERFACE_CLASSIFIER_T classi[TUNE_NETAPI_MAX_CLASSIFIERS]; //classifiers\r
133 NETCP_REGISTERED_FLOWS_T flows[TUNE_NETAPI_MAX_FLOWS]; //flows\r
134 NETCP_IPSEC_SA_T tunnel[TUNE_NETAPI_MAX_SA]; //tunnels\r
135 NETCP_IPSEC_POLICY_T policy[TUNE_NETAPI_MAX_POLICY]; //policies\r
136 NETCP_INTERFACE_IP_T ips[TUNE_NETAPI_MAX_IP]; //ips\r
137 } NETAPI_NWAL_GLOBAL_CONTEXT_T;\r
138 \r
139 /* NWAL Local context (per core/thread) */\r
140 typedef struct\r
141 {\r
142 //void * nwalLocInstance;\r
143 #define NETAPI_NW_CXT_LOC_INACTIVE 0x0\r
144 #define NETAPI_NW_CXT_LOC_ACTIVE 0x2\r
145 int state;\r
146 \r
147 int numPendingCfg;\r
148 NETCP_CFG_STATS_CB stats_cb;\r
149 \r
150 /* stats */\r
151 int numL2PktsRecvd;\r
152 int numL3PktsRecvd;\r
153 int numL4PktsRecvd;\r
154 int numL4PktsSent;\r
155 int TxErrDrop;\r
156 \r
157 /* local config */\r
158 nwalLocCfg_t nwalLocCfg;\r
159 } NETAPI_NWAL_LOCAL_CONTEXT_T;\r
160 \r
161 /* the global */\r
162 typedef struct NETAPI_GLOBAL_tag\r
163 {\r
164 #define NETAPI_MAX_PKTIO (TUNE_NETAPI_MAX_PKTIO) \r
165 PKTIO_ENTRY_T pktios[NETAPI_MAX_PKTIO];\r
166 \r
167 /* pktlib heap */\r
168 \r
169 /* global timers */\r
170 \r
171 /* nwal context */\r
172 NETAPI_NWAL_GLOBAL_CONTEXT_T nwal_context;\r
173 \r
174 } NETAPI_GLOBAL_T;\r
175 \r
176 \r
177 /************************************\r
178 * this is a per thread structure.\r
179 * It contains stuff local to thread\r
180 * and pointer to global stuff\r
181 * that is shared over all threads,\r
182 **************************************/\r
183 typedef struct NETAPI_HANDLE_Tag\r
184 {\r
185 int master; //master type\r
186 \r
187 void * global; /* pointer to the global area */\r
188 \r
189 /* heap handles */\r
190 Pktlib_HeapHandle netcp_heap; /* internal default */\r
191 Pktlib_HeapHandle netcp_control_heap; /* for control messages */\r
192 Pktlib_HeapHandle createdHeaps[TUNE_NETAPI_MAX_HEAPS]; /* created by app and registered */\r
193 \r
194 /* pktios defined */\r
195 int n_pktios; /* #of pktios that are active for this instance */\r
196 void* pktios[NETAPI_MAX_PKTIO]; /* the list of pktios */\r
197 \r
198 /* scheduler stuff. unallocated if NETAPI_INCLUDE_SCHED not set */\r
199 void * p_sched;\r
200 \r
201 /* nwal local context */\r
202 NETAPI_NWAL_LOCAL_CONTEXT_T nwal_local;\r
203 \r
204 /* security stuff */\r
205 \r
206 /* timer stuff */\r
207 \r
208 /* thread cookie */\r
209 void * cookie; /*set by calling thread */\r
210 \r
211 } NETAPI_HANDLE_T;\r
212 \r
213 \r
214 //internal initialization routines */\r
215 int netapi_init_qm(void);\r
216 int netapi_init_cppi(void);\r
217 int netapi_init_cpsw(void);\r
218 int netapi_start_qm(void);\r
219 int netapi_init_nwal(\r
220 int region2use,\r
221 Pktlib_HeapIfTable * p_table,\r
222 NETAPI_NWAL_GLOBAL_CONTEXT_T * p_nwal_context );\r
223 int netapi_start_nwal(Pktlib_HeapHandle pkt_heap,\r
224 Pktlib_HeapHandle cmd_heap,\r
225 NETAPI_NWAL_LOCAL_CONTEXT_T *p ,\r
226 NETAPI_NWAL_GLOBAL_CONTEXT_T * p_nwal_glob_context );\r
227 \r
228 int netapi_init_timer(void);\r
229 int netapi_qm_setup_mem_region(\r
230 unsigned int numDesc,\r
231 unsigned int descSize,\r
232 unsigned int* pDescMemBase,\r
233 int memRegion);\r
234 //for above\r
235 #define NETAPI_GLOBAL_REGION TUNE_NETAPI_QM_GLOBAL_REGION \r
236 #define NETAPI_LOCAL_REGION ((NETAPI_GLOBAL_REGION)+1) \r
237 \r
238 int netapi_VM_memory_setup(void);\r
239 void netapi_VM_memory_teardown(void);\r
240 \r
241 //nwal callbacks\r
242 void netapi_NWALRxPktCallback (uint32_t appCookie,\r
243 uint16_t numPkts,\r
244 nwalRxPktInfo_t* pPktInfo,\r
245 uint64_t timestamp,\r
246 nwal_Bool_t* pFreePkt);\r
247 \r
248 void netapi_NWALCmdCallBack (nwal_AppId appHandle,\r
249 uint16_t trans_id,\r
250 nwal_RetValue ret);\r
251 \r
252 void netapi_NWALCmdPaStatsReply (nwal_AppId appHandle,\r
253 nwal_TransID_t trans_id,\r
254 paSysStats_t *stats);\r
255 \r
256 void netapi_NWALSBPktCallback (uint32_t appCookie,\r
257 uint16_t numPkts,\r
258 nwalDmRxPayloadInfo_t* pDmRxPktInfo,\r
259 nwal_Bool_t* pFreePkt);\r
260 \r
261 \r
262 //***********************************\r
263 //internal utilities\r
264 //*************************************\r
265 \r
266 //return the list of pktios for this instance\r
267 static inline void ** netapi_get_pktio_list(NETAPI_T p)\r
268 {\r
269 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;\r
270 return &pp->pktios[0];\r
271 }\r
272 \r
273 //get scheduler block handle\r
274 static inline void * netapi_get_scheduler(NETAPI_T p)\r
275 {\r
276 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;\r
277 return pp->p_sched;\r
278 }\r
279 \r
280 /* return pointer to global area */\r
281 NETAPI_GLOBAL_T * netapi_get_global(void);\r
282 \r
283 //add a pktio name (and queue) to global list\r
284 static inline int netapi_add_global_pktio(NETAPI_T p, char *name, Qmss_Queue * qn)\r
285 {\r
286 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;\r
287 PKTIO_ENTRY_T *pe;\r
288 int i;\r
289 //find a free slot\r
290 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];\r
291 \r
292 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)\r
293 {\r
294 if (pe->qn.qNum == -1)\r
295 {\r
296 pe->qn.qNum=qn->qNum;\r
297 pe->qn.qMgr=qn->qMgr;\r
298 strncpy(pe->name, name, PKTIO_MAX_NAME);\r
299 return 1;\r
300 }\r
301 pe+=1;\r
302 }\r
303 return 0; //no room\r
304 }\r
305 \r
306 //delete a pktio name (and queue) to global list\r
307 static inline int netapi_del_global_pktio(NETAPI_T p, char *name)\r
308 {\r
309 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;\r
310 PKTIO_ENTRY_T *pe;\r
311 int i;\r
312 //find slot\r
313 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];\r
314 \r
315 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)\r
316 {\r
317 if (pe->qn.qNum == -1) continue;\r
318 if (!strncmp(name, pe->name, PKTIO_MAX_NAME))\r
319 {\r
320 pe->qn.qNum=-1;\r
321 pe->name[0]='\0';\r
322 return 1;\r
323 }\r
324 pe+=1;\r
325 }\r
326 return 0; //no room\r
327 }\r
328 \r
329 \r
330 /* get list of global pktios that have been created */\r
331 static inline Qmss_Queue* netapi_find_global_pktio(NETAPI_T p, char *name)\r
332 {\r
333 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;\r
334 PKTIO_ENTRY_T *pe;\r
335 int i;\r
336 //find slot\r
337 pe = &((NETAPI_GLOBAL_T *)(pp->global))->pktios[0];\r
338 \r
339 for(i=0;i<NETAPI_MAX_PKTIO; i++,pe++)\r
340 {\r
341 if (pe->qn.qNum == -1) continue;\r
342 if (!strncmp(name, pe->name, PKTIO_MAX_NAME))\r
343 {\r
344 return &pe->qn;\r
345 }\r
346 pe +=1;\r
347 }\r
348 return NULL; //not found\r
349 }\r
350 \r
351 /* return the nwal global instance handle */\r
352 static inline nwal_Handle netapi_return_nwal_instance_handle(NETAPI_T p)\r
353 {\r
354 \r
355 NETAPI_HANDLE_T *pp = (NETAPI_HANDLE_T *) p;\r
356 return ((NETAPI_GLOBAL_T *)(pp->global))->nwal_context.nwalInstHandle;\r
357 }\r
358 \r
359 //utility to clear out a queue\r
360 void netapi_zapQ(int queueNum);\r
361 void netcp_cfgp_build_route(NETCP_CFG_ROUTE_T * p_route, int16_t * p_flow, Qmss_QueueHnd * p_q);\r
362 \r
363 //database utilities\r
364 int netcp_cfgp_find_saslot( NETAPI_NWAL_GLOBAL_CONTEXT_T *p, int iface);\r
365 void netcp_cfgp_delete_sa(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,int sa_slot);\r
366 void netcp_cfgp_insert_sa(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,\r
367 int sa_slot, //we 'reserved it already'\r
368 int dir,\r
369 int mode,\r
370 void * temp1,\r
371 void * temp2,\r
372 void * handle_inflow,\r
373 void * handle_sideband);\r
374 void *netcp_cfgp_get_sa_handles( NETAPI_NWAL_GLOBAL_CONTEXT_T *p,\r
375 int sa_slot, void ** p_sideband);\r
376 void* netcp_cfgp_get_mac_handle(NETAPI_NWAL_GLOBAL_CONTEXT_T *p,int iface_no);\r
377 NetapiNwalTransInfo_t * netapip_GetFreeTransInfo(NETAPI_GLOBAL_T *p_global, nwal_TransID_t *pTransId);\r
378 void *netcp_cfgp_get_policy( NETAPI_NWAL_GLOBAL_CONTEXT_T *p,\r
379 int policy_slot);\r
380 #endif\r