• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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