1515#include <zephyr/sys/base64.h>
1616#include <zephyr/mgmt/mcumgr/mgmt/mgmt.h>
1717#include <zephyr/mgmt/mcumgr/smp/smp.h>
18- #include <zephyr/mgmt/mcumgr/transport/serial.h>
19-
20- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
21- #include <mgmt/mcumgr/transport/smp_internal.h>
22- #endif
18+ #include <serial.h>
2319
2420static void mcumgr_serial_free_rx_ctxt (struct mcumgr_serial_rx_ctxt * rx_ctxt )
2521{
@@ -29,7 +25,6 @@ static void mcumgr_serial_free_rx_ctxt(struct mcumgr_serial_rx_ctxt *rx_ctxt)
2925 }
3026}
3127
32- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE )
3328static uint16_t mcumgr_serial_calc_crc (const uint8_t * data , int len )
3429{
3530 return crc16_itu_t (0x0000 , data , len );
@@ -62,49 +57,7 @@ static int mcumgr_serial_decode_frag(struct mcumgr_serial_rx_ctxt *rx_ctxt,
6257
6358 return 0 ;
6459}
65- #endif
66-
67- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
68- static inline bool mcumgr_serial_process_frag_raw (struct mcumgr_serial_rx_ctxt * rx_ctxt ,
69- const uint8_t * frag , int frag_len ,
70- struct smp_hdr * rec_hdr )
71- {
72- uint16_t total_size ;
7360
74- net_buf_add_mem (rx_ctxt -> nb , frag , frag_len );
75-
76- if (rx_ctxt -> nb -> len < sizeof (struct smp_hdr )) {
77- /* Missing header */
78- return false;
79- }
80-
81- /*
82- * Perform some basic cursory checks to ensure some fields of the packet are
83- * actually valid.
84- */
85- rec_hdr = (struct smp_hdr * )rx_ctxt -> nb -> data ;
86- total_size = sys_be16_to_cpu (rec_hdr -> nh_len ) + sizeof (struct smp_hdr );
87-
88- if (total_size > CONFIG_MCUMGR_TRANSPORT_NETBUF_SIZE ) {
89- /* Payload is longer than the maximum supported MTU. */
90- mcumgr_serial_free_rx_ctxt (rx_ctxt );
91- return false;
92- } else if (rec_hdr -> nh_op >= MGMT_OP_COUNT ) {
93- /* Unknown op-code, likely not a valid MCUmgr message. */
94- mcumgr_serial_free_rx_ctxt (rx_ctxt );
95- return false;
96- } else if (rx_ctxt -> nb -> len < total_size ) {
97- /* More fragments expected. */
98- return false;
99- } else if (rx_ctxt -> nb -> len > total_size ) {
100- /* Payload longer than indicated in header. */
101- mcumgr_serial_free_rx_ctxt (rx_ctxt );
102- return false;
103- }
104-
105- return true;
106- }
107- #endif
10861
10962/**
11063 * Processes a received mcumgr frame.
@@ -118,14 +71,9 @@ struct net_buf *mcumgr_serial_process_frag(struct mcumgr_serial_rx_ctxt *rx_ctxt
11871{
11972 struct net_buf * nb ;
12073
121- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE )
12274 int rc ;
12375 uint16_t crc ;
12476 uint16_t op ;
125- #endif
126- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
127- struct smp_hdr * rec_hdr ;
128- #endif
12977
13078 if (rx_ctxt -> nb == NULL ) {
13179 rx_ctxt -> nb = smp_packet_alloc ();
@@ -135,86 +83,66 @@ struct net_buf *mcumgr_serial_process_frag(struct mcumgr_serial_rx_ctxt *rx_ctxt
13583 }
13684 }
13785
138- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE ) && \
139- defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
140- if (rx_ctxt -> raw_transport == true) {
141- #endif
142- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
143- if (mcumgr_serial_process_frag_raw (rx_ctxt , frag , frag_len , rec_hdr ) == false) {
144- return NULL ;
145- }
146- #endif
147- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE ) && \
148- defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
149- } else {
150- #endif
151- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE )
152- if (frag_len < sizeof (op )) {
153- return NULL ;
154- }
155-
156- op = sys_be16_to_cpu (* (uint16_t * )frag );
157- switch (op ) {
158- case MCUMGR_SERIAL_HDR_PKT :
159- net_buf_reset (rx_ctxt -> nb );
160- break ;
161-
162- case MCUMGR_SERIAL_HDR_FRAG :
163- if (rx_ctxt -> nb -> len == 0U ) {
164- mcumgr_serial_free_rx_ctxt (rx_ctxt );
165- return NULL ;
166- }
167- break ;
86+ if (frag_len < sizeof (op )) {
87+ return NULL ;
88+ }
16889
169- default :
170- return NULL ;
171- }
90+ op = sys_be16_to_cpu (* (uint16_t * )frag );
91+ switch (op ) {
92+ case MCUMGR_SERIAL_HDR_PKT :
93+ net_buf_reset (rx_ctxt -> nb );
94+ break ;
17295
173- rc = mcumgr_serial_decode_frag (rx_ctxt ,
174- frag + sizeof (op ),
175- frag_len - sizeof (op ));
176- if (rc != 0 ) {
96+ case MCUMGR_SERIAL_HDR_FRAG :
97+ if (rx_ctxt -> nb -> len == 0U ) {
17798 mcumgr_serial_free_rx_ctxt (rx_ctxt );
17899 return NULL ;
179100 }
101+ break ;
180102
181- if (op == MCUMGR_SERIAL_HDR_PKT ) {
182- rc = mcumgr_serial_extract_len (rx_ctxt );
183- if (rc < 0 ) {
184- mcumgr_serial_free_rx_ctxt (rx_ctxt );
185- return NULL ;
186- }
187- }
103+ default :
104+ return NULL ;
105+ }
188106
189- if (rx_ctxt -> nb -> len < rx_ctxt -> pkt_len ) {
190- /* More fragments expected. */
191- return NULL ;
192- } else if (rx_ctxt -> nb -> len > rx_ctxt -> pkt_len ) {
193- /* Payload longer than indicated in header. */
194- mcumgr_serial_free_rx_ctxt (rx_ctxt );
195- return NULL ;
196- }
107+ rc = mcumgr_serial_decode_frag (rx_ctxt ,
108+ frag + sizeof (op ),
109+ frag_len - sizeof (op ));
110+ if (rc != 0 ) {
111+ mcumgr_serial_free_rx_ctxt (rx_ctxt );
112+ return NULL ;
113+ }
197114
198- crc = mcumgr_serial_calc_crc (rx_ctxt -> nb -> data , rx_ctxt -> nb -> len );
199- if (crc != 0U ) {
115+ if (op == MCUMGR_SERIAL_HDR_PKT ) {
116+ rc = mcumgr_serial_extract_len (rx_ctxt );
117+ if (rc < 0 ) {
200118 mcumgr_serial_free_rx_ctxt (rx_ctxt );
201119 return NULL ;
202120 }
121+ }
122+
123+ if (rx_ctxt -> nb -> len < rx_ctxt -> pkt_len ) {
124+ /* More fragments expected. */
125+ return NULL ;
126+ } else if (rx_ctxt -> nb -> len > rx_ctxt -> pkt_len ) {
127+ /* Payload longer than indicated in header. */
128+ mcumgr_serial_free_rx_ctxt (rx_ctxt );
129+ return NULL ;
130+ }
131+
132+ crc = mcumgr_serial_calc_crc (rx_ctxt -> nb -> data , rx_ctxt -> nb -> len );
133+ if (crc != 0U ) {
134+ mcumgr_serial_free_rx_ctxt (rx_ctxt );
135+ return NULL ;
136+ }
203137
204138 /* Packet is complete; strip the CRC. */
205139 rx_ctxt -> nb -> len -= 2U ;
206- #endif
207- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE ) && \
208- defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_RAW_BINARY_NON_SMP_OVER_CONSOLE )
209- }
210- #endif
211140
212141 nb = rx_ctxt -> nb ;
213142 rx_ctxt -> nb = NULL ;
214143 return nb ;
215144}
216145
217- #if defined(CONFIG_MCUMGR_TRANSPORT_SERIAL_HAS_SMP_OVER_CONSOLE )
218146/**
219147 * Base64-encodes a small chunk of data and transmits it. The data must be no larger than three
220148 * bytes.
@@ -386,4 +314,3 @@ int mcumgr_serial_tx_pkt(const uint8_t *data, int len, mcumgr_serial_tx_cb cb)
386314
387315 return 0 ;
388316}
389- #endif
0 commit comments