1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: pkt router
15 * This file should be changed only infrequently and with great care.
16 */
17 #include "zdiag_pkt_router.h"
18 #include "diag_msg.h"
19 #include "zdiag_mem.h"
20 #include "zdiag_cmd_dst.h"
21 #include "zdiag_ind_dst.h"
22 #include "zdiag_tx.h"
23 #include "zdiag_debug.h"
24 #include "diag_adapt_layer.h"
25 #include "diag_dfx.h"
26 #include "dfx_adapt_layer.h"
27 #include "zdiag_mem.h"
28 #include "errcode.h"
29
diag_pkt_router_forwarding_exec(diag_pkt_handle_t * pkt,const diag_pkt_process_param_t * process_param)30 STATIC errcode_t diag_pkt_router_forwarding_exec(diag_pkt_handle_t *pkt, const diag_pkt_process_param_t *process_param)
31 {
32 unused(process_param);
33 return zdiag_pkt_router_tx(pkt);
34 }
35
diag_pkt_router_forwarding_queue(diag_pkt_handle_t * pkt,const diag_pkt_process_param_t * process_param)36 STATIC errcode_t diag_pkt_router_forwarding_queue(diag_pkt_handle_t *pkt, const diag_pkt_process_param_t *process_param)
37 {
38 errcode_t ret;
39 diag_pkt_msg_t msg;
40 unused(process_param);
41
42 zdiag_pkt_printf("forward_a", pkt);
43 ret = diag_pkt_need_cross_task(pkt);
44 if (ret != ERRCODE_SUCC) {
45 dfx_log_err("[ERROR][%s][%d][errcode=%u]\r\n", __func__, __LINE__, ret);
46 return ret;
47 }
48 zdiag_pkt_printf("forward_b", pkt);
49
50 msg.pkt = *pkt;
51 msg.cur_proc = DIAG_PKT_PPOC_OUT_PUT_Q;
52 ret = dfx_msg_write(DFX_MSG_ID_DIAG_PKT, (uint8_t *)&msg, sizeof(diag_pkt_msg_t), false);
53 if (ret == ERRCODE_SUCC) {
54 diag_pkt_handle_clean(pkt);
55 }
56 return ret;
57 }
58
diag_pkt_router_local_exec(diag_pkt_handle_t * pkt,const diag_pkt_process_param_t * process_param)59 STATIC errcode_t diag_pkt_router_local_exec(diag_pkt_handle_t *pkt, const diag_pkt_process_param_t *process_param)
60 {
61 msp_mux_packet_head_stru_t *mux = diag_pkt_handle_get_mux(pkt);
62 mux_pkt_type_t mux_type = mux->type;
63 diag_option_t option = DIAG_OPTION_INIT_VAL;
64 option.peer_addr = mux->src;
65
66 unused(process_param);
67
68 dfx_log_debug("diag_pkt_router_local_exec mux_type=%d\r\n", mux_type);
69 switch (mux_type) {
70 case MUX_PKT_CMD:
71 return diag_pkt_router_run_cmd(pkt, &option);
72 case MUX_PKT_IND:
73 return diag_pkt_router_run_ind(pkt, &option);
74 default:
75 return ERRCODE_FAIL;
76 }
77 }
78
diag_pkt_router_local_queue(diag_pkt_handle_t * pkt,const diag_pkt_process_param_t * process_param)79 STATIC errcode_t diag_pkt_router_local_queue(diag_pkt_handle_t *pkt, const diag_pkt_process_param_t *process_param)
80 {
81 errcode_t ret;
82 diag_pkt_msg_t msg;
83
84 unused(process_param);
85
86 ret = diag_pkt_need_cross_task(pkt);
87 if (ret != ERRCODE_SUCC) {
88 dfx_log_err("[ERROR][%s][%d][errcode=%u]\r\n", __func__, __LINE__, ret);
89 return ret;
90 }
91
92 msg.cur_proc = DIAG_PKT_PPOC_LOCAL_EXEC_Q;
93 msg.pkt = *pkt;
94 ret = dfx_msg_write(DFX_MSG_ID_DIAG_PKT, (uint8_t *)&msg, sizeof(diag_pkt_msg_t), false);
95 if (ret == ERRCODE_SUCC) {
96 zdiag_dfx_send_local_q_success();
97 diag_pkt_handle_clean(pkt);
98 } else {
99 zdiag_dfx_send_local_q_fail();
100 }
101 return ret;
102 }
103
diag_pkt_router_out_put(diag_pkt_handle_t * pkt,diag_pkt_process_param_t * process_param)104 STATIC errcode_t diag_pkt_router_out_put(diag_pkt_handle_t *pkt, diag_pkt_process_param_t *process_param)
105 {
106 diag_pkt_proc_t cur_proc = process_param->cur_proc;
107
108 if (cur_proc == DIAG_PKT_PPOC_OUT_PUT_Q || cur_proc == DIAG_PKT_PROC_USR_SYNC_CMD_IND) {
109 return diag_pkt_router_forwarding_exec(pkt, process_param);
110 } else {
111 return diag_pkt_router_forwarding_queue(pkt, process_param);
112 }
113 }
114
diag_pkt_router_local(diag_pkt_handle_t * pkt,diag_pkt_process_param_t * process_param)115 STATIC errcode_t diag_pkt_router_local(diag_pkt_handle_t *pkt, diag_pkt_process_param_t *process_param)
116 {
117 switch (process_param->cur_proc) {
118 case DIAG_PKT_PROC_PORT_PKT:
119 case DIAG_PKT_PROC_USR_ASYNC_CMD_IND:
120 return diag_pkt_router_local_queue(pkt, process_param);
121 case DIAG_PKT_PPOC_LOCAL_EXEC_Q:
122 case DIAG_PKT_PROC_USR_SYNC_CMD_IND:
123 return diag_pkt_router_local_exec(pkt, process_param);
124 default:
125 return ERRCODE_FAIL;
126 }
127 }
128
diag_pkt_router(diag_pkt_handle_t * pkt,diag_pkt_process_param_t * process_param)129 errcode_t diag_pkt_router(diag_pkt_handle_t *pkt, diag_pkt_process_param_t *process_param)
130 {
131 errcode_t ret;
132 diag_addr dst_addr, local_addr;
133 msp_mux_packet_head_stru_t *mux = diag_pkt_handle_get_mux(pkt);
134
135 dfx_log_debug("%s\r\n", __func__);
136 dfx_log_debug("cur_proc=%d src=%d dst=%d\r\n", process_param->cur_proc, mux->src, mux->dst);
137 dfx_log_debug("type=%d cmd_id=%d need_free=%d\r\n", mux->type, mux->cmd_id, pkt->need_free);
138
139 dst_addr = mux->dst;
140 local_addr = diag_adapt_get_local_addr();
141 if (dst_addr != local_addr) {
142 ret = diag_pkt_router_out_put(pkt, process_param);
143 } else {
144 ret = diag_pkt_router_local(pkt, process_param);
145 }
146
147 diag_pkt_free(pkt);
148 return ret;
149 }
150
diag_pkt_msg_proc(uint32_t msg_id,uint8_t * msg,uint32_t msg_len)151 void diag_pkt_msg_proc(uint32_t msg_id, uint8_t *msg, uint32_t msg_len)
152 {
153 diag_pkt_msg_t *pkt_msg = (diag_pkt_msg_t *)msg;
154 diag_pkt_process_param_t process_param;
155 process_param.cur_proc = pkt_msg->cur_proc;
156 diag_pkt_router(&pkt_msg->pkt, &process_param);
157 unused(msg_id);
158 unused(msg_len);
159 }
160