66 */
77
88#include <endian.h>
9+ #include <string.h>
10+
911#include <csp/csp.h>
12+ #include <csp/csp_id.h>
1013
1114/**
1215 * CSP 1.x
4043static void csp_id1_prepend (csp_packet_t * packet ) {
4144
4245 /* Pack into 32-bit using host endian */
43- uint32_t id1 = (((uint32_t )(packet -> id .pri ) << CSP_ID1_PRIO_OFFSET ) |
44- ((uint32_t )(packet -> id .dst ) << CSP_ID1_DST_OFFSET ) |
45- ((uint32_t )(packet -> id .src ) << CSP_ID1_SRC_OFFSET ) |
46- ((uint32_t )(packet -> id .dport ) << CSP_ID1_DPORT_OFFSET ) |
47- ((uint32_t )(packet -> id .sport ) << CSP_ID1_SPORT_OFFSET ) |
48- ((uint32_t )(packet -> id .flags ) << CSP_ID1_FLAGS_OFFSET ));
46+ uint32_t id1_raw = (((uint32_t )(packet -> id .pri ) << CSP_ID1_PRIO_OFFSET ) |
47+ ((uint32_t )(packet -> id .dst ) << CSP_ID1_DST_OFFSET ) |
48+ ((uint32_t )(packet -> id .src ) << CSP_ID1_SRC_OFFSET ) |
49+ ((uint32_t )(packet -> id .dport ) << CSP_ID1_DPORT_OFFSET ) |
50+ ((uint32_t )(packet -> id .sport ) << CSP_ID1_SPORT_OFFSET ) |
51+ ((uint32_t )(packet -> id .flags ) << CSP_ID1_FLAGS_OFFSET ));
4952
5053 /* Convert to big / network endian */
51- id1 = htobe32 (id1 );
54+ uint32_t id1 = htobe32 (id1_raw );
5255
5356 packet -> frame_begin = packet -> data - CSP_ID1_HEADER_SIZE ;
5457 packet -> frame_length = packet -> length + CSP_ID1_HEADER_SIZE ;
5558
5659 memcpy (packet -> frame_begin , & id1 , CSP_ID1_HEADER_SIZE );
5760}
5861
59- static int csp_id1_strip (csp_packet_t * packet ) {
60-
61- if (packet -> frame_length < CSP_ID1_HEADER_SIZE ) {
62- return -1 ;
63- }
62+ static csp_id_t csp_id1_extract (const uint8_t * data ) {
6463
6564 /* Get 32 bit in network byte order */
66- uint32_t id1 = 0 ;
67- memcpy (& id1 , packet -> frame_begin , CSP_ID1_HEADER_SIZE );
68- packet -> length = packet -> frame_length - CSP_ID1_HEADER_SIZE ;
65+ uint32_t id1_raw = 0 ;
66+ memcpy (& id1_raw , data , CSP_ID1_HEADER_SIZE );
6967
7068 /* Convert to host order */
71- id1 = be32toh (id1 );
69+ uint32_t id1 = be32toh (id1_raw );
7270
7371 /* Parse header:
7472 * Now in easy to work with in 32 bit register */
75- packet -> id .pri = (id1 >> CSP_ID1_PRIO_OFFSET ) & CSP_ID1_PRIO_MASK ;
76- packet -> id .dst = (id1 >> CSP_ID1_DST_OFFSET ) & CSP_ID1_DST_MASK ;
77- packet -> id .src = (id1 >> CSP_ID1_SRC_OFFSET ) & CSP_ID1_SRC_MASK ;
78- packet -> id .dport = (id1 >> CSP_ID1_DPORT_OFFSET ) & CSP_ID1_DPORT_MASK ;
79- packet -> id .sport = (id1 >> CSP_ID1_SPORT_OFFSET ) & CSP_ID1_SPORT_MASK ;
80- packet -> id .flags = (id1 >> CSP_ID1_FLAGS_OFFSET ) & CSP_ID1_FLAGS_MASK ;
81-
82- return 0 ;
73+ csp_id_t id ;
74+ id .pri = (id1 >> CSP_ID1_PRIO_OFFSET ) & CSP_ID1_PRIO_MASK ;
75+ id .dst = (id1 >> CSP_ID1_DST_OFFSET ) & CSP_ID1_DST_MASK ;
76+ id .src = (id1 >> CSP_ID1_SRC_OFFSET ) & CSP_ID1_SRC_MASK ;
77+ id .dport = (id1 >> CSP_ID1_DPORT_OFFSET ) & CSP_ID1_DPORT_MASK ;
78+ id .sport = (id1 >> CSP_ID1_SPORT_OFFSET ) & CSP_ID1_SPORT_MASK ;
79+ id .flags = (id1 >> CSP_ID1_FLAGS_OFFSET ) & CSP_ID1_FLAGS_MASK ;
80+
81+ return id ;
8382}
8483
8584static void csp_id1_setup_rx (csp_packet_t * packet ) {
@@ -136,17 +135,12 @@ static void csp_id2_prepend(csp_packet_t * packet) {
136135 memcpy (packet -> frame_begin , & id2 , CSP_ID2_HEADER_SIZE );
137136}
138137
139- static int csp_id2_strip (csp_packet_t * packet ) {
140-
141- if (packet -> frame_length < CSP_ID2_HEADER_SIZE ) {
142- return -1 ;
143- }
138+ static csp_id_t csp_id2_extract (const uint8_t * data ) {
144139
145140 /* Get 48 bit in network byte order:
146141 * Most significant byte ends in byte 0 */
147142 uint64_t id2 = 0 ;
148- memcpy (& id2 , packet -> frame_begin , CSP_ID2_HEADER_SIZE );
149- packet -> length = packet -> frame_length - CSP_ID2_HEADER_SIZE ;
143+ memcpy (& id2 , data , CSP_ID2_HEADER_SIZE );
150144
151145 /* Convert to host order:
152146 * Most significant byte ends in byte 7, we then shift down
@@ -155,14 +149,15 @@ static int csp_id2_strip(csp_packet_t * packet) {
155149
156150 /* Parse header:
157151 * Now in easy to work with in 32 bit register */
158- packet -> id .pri = (id2 >> CSP_ID2_PRIO_OFFSET ) & CSP_ID2_PRIO_MASK ;
159- packet -> id .dst = (id2 >> CSP_ID2_DST_OFFSET ) & CSP_ID2_DST_MASK ;
160- packet -> id .src = (id2 >> CSP_ID2_SRC_OFFSET ) & CSP_ID2_SRC_MASK ;
161- packet -> id .dport = (id2 >> CSP_ID2_DPORT_OFFSET ) & CSP_ID2_DPORT_MASK ;
162- packet -> id .sport = (id2 >> CSP_ID2_SPORT_OFFSET ) & CSP_ID2_SPORT_MASK ;
163- packet -> id .flags = (id2 >> CSP_ID2_FLAGS_OFFSET ) & CSP_ID2_FLAGS_MASK ;
164-
165- return 0 ;
152+ csp_id_t id ;
153+ id .pri = (id2 >> CSP_ID2_PRIO_OFFSET ) & CSP_ID2_PRIO_MASK ;
154+ id .dst = (id2 >> CSP_ID2_DST_OFFSET ) & CSP_ID2_DST_MASK ;
155+ id .src = (id2 >> CSP_ID2_SRC_OFFSET ) & CSP_ID2_SRC_MASK ;
156+ id .dport = (id2 >> CSP_ID2_DPORT_OFFSET ) & CSP_ID2_DPORT_MASK ;
157+ id .sport = (id2 >> CSP_ID2_SPORT_OFFSET ) & CSP_ID2_SPORT_MASK ;
158+ id .flags = (id2 >> CSP_ID2_FLAGS_OFFSET ) & CSP_ID2_FLAGS_MASK ;
159+
160+ return id ;
166161}
167162
168163static void csp_id2_setup_rx (csp_packet_t * packet ) {
@@ -186,13 +181,22 @@ void csp_id_prepend(csp_packet_t * packet) {
186181 }
187182}
188183
189- int csp_id_strip (csp_packet_t * packet ) {
190- packet -> timestamp_rx = 0 ;
184+ csp_id_t csp_id_extract (const uint8_t * data ) {
191185 if (csp_conf .version == 2 ) {
192- return csp_id2_strip ( packet );
186+ return csp_id2_extract ( data );
193187 } else {
194- return csp_id1_strip (packet );
188+ return csp_id1_extract (data );
189+ }
190+ }
191+
192+ int csp_id_strip (csp_packet_t * packet ) {
193+ if (packet -> frame_length < csp_id_get_header_size ()) {
194+ return -1 ;
195195 }
196+
197+ packet -> id = csp_id_extract (packet -> frame_begin );
198+ packet -> length = packet -> frame_length - csp_id_get_header_size ();
199+ return 0 ;
196200}
197201
198202int csp_id_setup_rx (csp_packet_t * packet ) {
@@ -241,3 +245,11 @@ int csp_id_is_broadcast(uint16_t addr, csp_iface_t * iface) {
241245 }
242246 return 0 ;
243247}
248+
249+ int csp_id_get_header_size (void ) {
250+ if (csp_conf .version == 2 ) {
251+ return CSP_ID2_HEADER_SIZE ;
252+ } else {
253+ return CSP_ID1_HEADER_SIZE ;
254+ }
255+ }
0 commit comments