blob: 0bb3afd2ccfc3c9946ed7199abf1ae12e6961e71 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 * Filename:
38 * ---------
39 * dispatcher_struct.h
40 *
41 * Project:
42 * --------
43 * VMOLY
44 *
45 * Description:
46 * ------------
47 * Dispatcher data structure definition.
48 *
49 * Author:
50 * -------
51 * -------
52 *
53 *******************************************************************************/
54
55#ifndef __INC_DISPATCHER_STRUCT_H
56#define __INC_DISPATCHER_STRUCT_H
57
58
59#include "kal_public_api.h"
60#include "ps_public_enum.h"
61//#include "ps_public_struct.h"
62//#include "ddm_common_struct.h"
63#include "ipcore_dispatcher_struct.h"
64#include "n3epc_dispatcher_struct.h"
65#include "qmu_bm.h"
66#include "upcm.h"
67#include "dispatcher_ut.h"
68#include "dpcopro_custom.h"
69#include "wtunnel_api.h"
70
71#define DISPATCHER_PDNID_OFFSET 38
72#define INVALID_DEFAULT_BID 0
73
74
75#if defined(__MTK_TARGET__)
76#define DISPATCHER_VRB_ADDR_BANK (0x5)
77#define DISPATCHER_VRB_CHECK_VADDR(vrb_addr) (DISPATCHER_VRB_ADDR_BANK==(((kal_uint32)(vrb_addr))>>28))
78#undef kal_mem_cpy
79#define kal_mem_cpy(_p_dst, _p_src, _len) \
80 do { \
81 if (DISPATCHER_VRB_CHECK_VADDR(_p_src)) { \
82 dpcopro_vrb_copy((kal_uint8 *)_p_dst, (kal_uint8 *)_p_src, (kal_uint32)_len); \
83 } else { \
84 kal_mem_cpy(_p_dst, _p_src, _len); \
85 } \
86 } while (0)
87#endif
88
89
90#ifdef ATEST_SYS_DISPATCHER
91#define DISPATCHER_REGISTER_DL_DID_CBK dispatcher_ut_register_dl_cbk
92#define DISPATCHER_DROP_DL_DID dispatcher_ut_drop_dl_did
93#define DIPSTACHER_QUERY_META_TBL dispatcher_ut_query_meta_table
94#define DISPATCHER_FORWARD_UL_META_UPCM dispatcher_ut_forward_upcm_ul_meta
95#define DISPATCHER_FORWARD_UL_GPD_WTUNNEL dispatcher_ut_forward_wtunnel_ul_gpd
96#define DISPATCHER_FORWARD_UL_GPD_UPCM dispatcher_ut_forward_upcm_ul_gpd
97#define DISPATCHER_FORWARD_UL_GPD_UPCM_BY_EBI dispatcher_ut_forward_upcm_ul_gpd_by_ebi
98#define DISPATCHER_DROP_UL_GPD dispatcher_ut_drop_ul_gpd
99
100
101#else
102#define DISPATCHER_REGISTER_DL_DID_CBK wtunnel_upp_dl_reg_cbk
103#define DISPATCHER_DROP_DL_DID dispatcher_drop_dl_did
104#define DIPSTACHER_QUERY_META_TBL lhif_query_meta_table
105#define DISPATCHER_FORWARD_UL_META_UPCM upcm_rcv_ul_sdu_93
106#define DISPATCHER_FORWARD_UL_GPD_WTUNNEL dispatcher_wtunnel_ul_send
107#define DISPATCHER_FORWARD_UL_GPD_UPCM upcm_rcv_ul_sdu_93_gpd
108#define DISPATCHER_FORWARD_UL_GPD_UPCM_BY_EBI upcm_rcv_ul_sdu_by_ebi_93_gpd
109#define DISPATCHER_DROP_UL_GPD dispatcher_drop_ul_gpd
110#endif
111
112
113
114#ifndef ATEST_SYS_DISPATCHER
115#define IS_PDNID_OF_WIFI(_pdnid) \
116 (_pdnid > 38 && _pdnid < 54)
117
118#define IS_VALID_BEARERID(_bearerid) \
119 (_bearerid > 0 && _bearerid < 16)
120
121#define DISPATCHER_CONVERT_BEARERID_TO_PDNID(_bearerid, _pdnid) \
122 _pdnid = (_bearerid + 38)
123
124
125#define DISPATCHER_CONVERT_PDNID_TO_BEARERID(_pdnid, _bearerid) \
126 _bearerid = (_pdnid - 38)
127
128/* Free Copro vrb helper macro */
129#define DISPATCHER_FREE_META_VRB(_meta) \
130 do { \
131 ASSERT(_meta); \
132 dpcopro_rbuf_release(_meta->vrb_addr, _meta->length); \
133 } while (0)
134
135#else
136/*temp code will remove later, just to run the test case as LHIF 5 bit field for PDN*/
137#define IS_PDNID_OF_WIFI(_pdnid) \
138 (_pdnid > 0 && _pdnid < 16)
139
140#define IS_VALID_BEARERID(_bearerid) \
141 (_bearerid > 0 && _bearerid < 16)
142
143
144#define DISPATCHER_CONVERT_BEARERID_TO_PDNID(_bearerid, _pdnid) \
145 _pdnid = (_bearerid + 1)
146
147
148#define DISPATCHER_CONVERT_PDNID_TO_BEARERID(_pdnid, _bearerid) \
149 _bearerid = (_pdnid - 1)
150
151#undef DISPATCHER_FREE_META_VRB
152#define DISPATCHER_FREE_META_VRB
153#endif
154
155
156typedef enum {
157 DISPATCHER_PDN_ST_UNBIND,
158 DISPATCHER_PDN_ST_BINDING,
159 DISPATCHER_PDN_ST_BINDING_GOING_TO_UNBIND,
160 DISPATCHER_PDN_ST_BIND
161} dispatcher_bind_state_enum;
162
163typedef enum
164{
165 DISPATCHER_PENDING_REQ_NONE,
166 DISPATCHER_PENDING_REQ_UNBIND_IND,
167 DISPATCHER_PENDING_REQ_UNBIND_CNF,
168 DISPATCHER_PENDING_REQ_UNBIND_IND_N_CNF = (DISPATCHER_PENDING_REQ_UNBIND_IND | DISPATCHER_PENDING_REQ_UNBIND_CNF) // 3
169} dispatcher_pending_req_enum;
170
171typedef struct {
172 kal_uint8 bearer_id;
173 kal_uint8 defult_bearer_id;
174 kal_uint8 context_id; /**< index of cid_info */
175} dispatcher_bearer_info_struct;
176
177typedef struct {
178
179 kal_uint8 bearer_id; /**< bearer info index*/
180 kal_uint8 old_bearer_id; /**< useful when UNBIND->DEACT */
181 dispatcher_bind_state_enum bind_state;
182 dispatcher_pending_req_enum pending_req;
183
184 /** for keeping bind information for IPCORE */
185 kal_uint32 network_interface_id;
186 apn_type_info_struct apn_type_info;
187 ip_addr_struct ip_addr;
188 dns_struct dns;
189} dispatcher_cid_info_struct;
190
191typedef struct {
192 dispatcher_bearer_info_struct bearer_info[(MAX_EPDG_BEARER_ID + 1) - (MIN_EPDG_BEARER_ID - 1)]; /**< 1~15 are valid bearer id */
193 dispatcher_cid_info_struct cid_info[MAX_EPDG_CID]; /**< 0~199 are valid cid range */
194} dispatcher_control_cntx;
195
196/*control path */
197void n3epc_dispatcher_bearer_act_req(n3epc_dispatcher_bearer_act_req_struct *p_local);
198void n3epc_dispatcher_bearer_deact_req(n3epc_dispatcher_bearer_deact_req_struct *p_local);
199void n3epc_dispatcher_pdn_bind_req(n3epc_dispatcher_pdn_bind_req_struct *p_local, kal_uint32 src_mod_id);
200void n3epc_dispatcher_pdn_unbind_req(n3epc_dispatcher_pdn_unbind_req_struct *p_local, kal_uint32 src_mod_id);
201void ipcore_dispatcher_pdn_bind_rsp(ipcore_dispatcher_pdn_bind_rsp_struct *p_local);
202void dispatcher_unbind_cnf_optional_ipc_ind(dispatcher_bearer_info_struct *p_bearer_info, kal_bool ipc_unbind_required, kal_uint32 dest_mod_id, kal_uint8 proto_idx);
203void dispatcher_report_bind_unbind_error_cnf(kal_bool is_bindreq,
204 ps_cause_enum error_code,
205 kal_uint8 cid,
206 kal_uint32 reply_mod_id);
207
208/*data path*/
209
210kal_bool dispatcher_wtunnel_ul_send(kal_uint8 bearer_id, qbm_gpd *head, qbm_gpd *tail, kal_uint8 proto_idx);
211void dispatcher_utils_set_gpd_datalen(void *p_gpd, kal_uint32 datalen, void **p_payload);
212
213/*helper functions*/
214dispatcher_bind_state_enum dispatcher_get_bind_state_by_bearerid(kal_uint8 bearer_id, kal_uint8 proto_idx);
215dispatcher_bind_state_enum dispatcher_get_bind_state_by_pdnid(kal_uint8 pdn_id, kal_uint8 proto_idx);
216kal_bool dispatcher_check_is_bearer_active_by_pdnid(kal_uint8 pdn_id, kal_uint8 proto_idx);
217kal_bool dispatcher_check_is_bearer_active_by_bearerid(kal_uint8 bearer_id, kal_uint8 proto_idx);
218void dispatcher_forward_dl_did_to_ipc(kal_uint8 bearer_id, upcm_did* p_head, upcm_did* p_tail, kal_uint8 protocol_idx);
219void dispatcher_drop_dl_did(kal_uint8 bearer_id, upcm_did* p_head, upcm_did* p_tail, kal_uint8 protocol_idx);
220void dispatcher_drop_ul_gpd(kal_uint32 pdn_id, qbm_gpd* p_head, qbm_gpd* p_tail, kal_uint8 protocol_idx);
221void dispatcher_simulate_wtunnel_ul_gpd(kal_uint8 bearer_id, qbm_gpd* p_head, qbm_gpd* p_tail, kal_uint8 protocol_idx);
222void dispatcher_init_control_cntx(void);
223void dispatcher_ctrl_set_current_protoidx(kal_uint8 protoidx);
224
225#if defined(__SENSITIVE_DATA_MOSAIC__)
226void dispatcher_clean_private_data(void);
227#endif
228
229#endif /* __INC_DISPATCHER_STRUCT_H */