Skip to content

Commit b67a8c0

Browse files
committed
Improves formatting and naming convention.
Adds more test cases to check validate/encode functions.
1 parent acc9d98 commit b67a8c0

File tree

3 files changed

+106
-66
lines changed

3 files changed

+106
-66
lines changed

src/libosd/gdbserver-private.h

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,31 @@
2323

2424
/**
2525
* Return packet-data from the received data buffer by validating the checksum
26+
*
27+
* It calculates the checksum of the obtained packet-data and compares it with
28+
* the obtained checksum. This function ensures that the received packet-data
29+
* is valid and uncorrupted.
30+
* Refer https://sourceware.org/gdb/onlinedocs/gdb/Overview.html#Overview
2631
*
27-
* @param buf_p the pointer to the received packet buffer data
28-
* @param ver_checksum '1' indicates valid checksum
29-
* @param len the length of the packet-data
30-
* @param buffer the packet-data received
32+
* @param packet_buffer the pointer to the received packet buffer data
33+
* @param packet_len the length of th packet buffer
34+
* @param packet_data_len the length of the packet-data
35+
* @param packet_data the packet-data received
3136
*
3237
*/
33-
osd_result validate_rsp_packet(char *buf_p, bool *ver_checksum, int *len,
34-
char *buffer);
35-
38+
bool validate_rsp_packet(char *packet_buffer, int packet_len,
39+
int *packet_data_len, char *packet_data);
3640

3741
/**
3842
* Set packet-data into the RSP format: $packet-data#checksum
43+
*
44+
* Refer https://sourceware.org/gdb/onlinedocs/gdb/Overview.html#Overview
3945
*
40-
* @param buffer the packet-data buffer
41-
* @param len the length of the packet-data
42-
* @param packet_buffer the packet buffer in RSP format
46+
* @param packet_data the packet-data buffer
47+
* @param packet_data_len the length of the packet-data
48+
* @param packet_buffer the packet buffer in RSP format
4349
*/
44-
osd_result configure_rsp_packet(char *buffer, int len, char *packet_buffer);
45-
50+
osd_result encode_rsp_packet(char *packet_data, int packet_data_len,
51+
char *packet_buffer);
52+
4653
#endif // OSD_GDBSERVER_PRIVATE_H

src/libosd/gdbserver.c

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
*/
1515

1616
#include <osd/gdbserver.h>
17-
#include "gdbserver-private.h"
1817
#include <osd/module.h>
1918
#include <osd/osd.h>
2019
#include <osd/reg.h>
20+
#include "gdbserver-private.h"
2121
#include "osd-private.h"
2222

2323
#include <arpa/inet.h>
@@ -250,19 +250,19 @@ static osd_result get_char(struct osd_gdbserver_ctx *ctx, int *ch)
250250
return OSD_OK;
251251
}
252252

253-
//API_EXPORT
254-
osd_result validate_rsp_packet(char *buf_p, bool *ver_checksum, int *len,
255-
char *buffer)
253+
API_EXPORT
254+
bool validate_rsp_packet(char *packet_buffer, int packet_len,
255+
int *packet_data_len, char *packet_data)
256256
{
257257
unsigned char val_checksum = 0;
258258
char packet_checksum[3];
259259
int packet_char;
260260
int cnt = 0;
261-
char *buf = buf_p;
261+
char *buf = packet_buffer;
262262

263263
// packet-format: $packet-data#checksum
264264
// traversing through the obtained packet till we obtained '#'
265-
while (1) {
265+
while (packet_len >= 2) {
266266
packet_char = *buf++;
267267

268268
if (packet_char == '#') {
@@ -272,30 +272,33 @@ osd_result validate_rsp_packet(char *buf_p, bool *ver_checksum, int *len,
272272
* character followed by the original character XORed with 0x20.
273273
*/
274274
if (packet_char == '}') {
275-
val_checksum += packet_char & 0xff;
275+
val_checksum += packet_char;
276276
packet_char = *buf++;
277-
val_checksum += packet_char & 0xff;
278-
buffer[cnt++] = (packet_char ^ 0x20) & 0xff;
277+
packet_len--;
278+
val_checksum += packet_char;
279+
packet_data[cnt++] = (packet_char ^ 0x20);
279280
} else {
280-
val_checksum += packet_char & 0xff;
281-
buffer[cnt++] = packet_char & 0xff;
281+
val_checksum += packet_char;
282+
packet_data[cnt++] = packet_char;
282283
}
284+
packet_len--;
283285
}
284286

285-
buffer[cnt] = '\0';
286-
*len = cnt;
287287
packet_char = *buf++;
288288
packet_checksum[0] = packet_char;
289289
packet_char = *buf;
290290
packet_checksum[1] = packet_char;
291291
packet_checksum[2] = 0;
292-
*ver_checksum = (val_checksum == strtoul(packet_checksum, NULL, 16));
293292

294-
return OSD_OK;
293+
packet_data[cnt] = '\0';
294+
*packet_data_len = cnt;
295+
bool ver_checksum = (val_checksum == strtoul(packet_checksum, NULL, 16));
296+
297+
return ver_checksum;
295298
}
296299

297300
static osd_result receive_rsp_packet(struct osd_gdbserver_ctx *ctx,
298-
char *buffer, int *len)
301+
int *packet_data_len, char *packet_data)
299302
{
300303
int packet_char;
301304
osd_result rv;
@@ -307,34 +310,36 @@ static osd_result receive_rsp_packet(struct osd_gdbserver_ctx *ctx,
307310
}
308311
} while (packet_char != '$');
309312

310-
bool ver_checksum = 0;
311-
rv = validate_rsp_packet(ctx->buf_p, &ver_checksum, len, buffer);
313+
char *packet_buffer = ctx->buf_p;
314+
int packet_len = ctx->buf_cnt;
315+
bool ver_checksum = validate_rsp_packet(packet_buffer, packet_len,
316+
packet_data_len, packet_data);
312317

318+
if (ver_checksum == 1) {
319+
rv = osd_gdbserver_write_data(ctx, "+", 1);
320+
} else {
321+
rv = osd_gdbserver_write_data(ctx, "-", 1);
322+
}
313323
if (OSD_FAILED(rv)) {
314324
return rv;
315-
} else {
316-
if (ver_checksum == 1) {
317-
rv = osd_gdbserver_write_data(ctx, "+", 1);
318-
} else {
319-
rv = osd_gdbserver_write_data(ctx, "-", 1);
320-
}
321-
if (OSD_FAILED(rv)) {
322-
return rv;
323-
}
324325
}
326+
325327
return OSD_OK;
326328
}
327329

328330
API_EXPORT
329-
osd_result configure_rsp_packet(char *buffer, int len, char *packet_buffer)
331+
osd_result encode_rsp_packet(char *packet_data, int packet_data_len,
332+
char *packet_buffer)
330333
{
331334
int packet_checksum = 0;
332335
packet_buffer[0] = '$';
333-
memcpy(packet_buffer + 1, buffer, len);
334-
int j = len + 1;
336+
337+
memcpy(packet_buffer + 1, packet_data, packet_data_len);
338+
int j = packet_data_len + 1;
339+
335340
packet_buffer[j++] = '#';
336-
for (int i = 0; i < len; i++) {
337-
packet_checksum += buffer[i];
341+
for (int i = 0; i < packet_data_len; i++) {
342+
packet_checksum += packet_data[i];
338343
}
339344
packet_buffer[j++] = dectohex((packet_checksum >> 4) & 0xf);
340345
packet_buffer[j++] = dectohex(packet_checksum & 0xf);
@@ -343,16 +348,16 @@ osd_result configure_rsp_packet(char *buffer, int len, char *packet_buffer)
343348
return OSD_OK;
344349
}
345350

346-
static osd_result send_rsp_packet(struct osd_gdbserver_ctx *ctx, char *buffer,
347-
int len)
351+
static osd_result send_rsp_packet(struct osd_gdbserver_ctx *ctx,
352+
char *packet_data, int packet_data_len)
348353
{
349-
char packet_buffer[len + 5];
354+
char packet_buffer[packet_data_len + 5];
350355
osd_result rv;
351356

352357
while (1) {
353-
configure_rsp_packet(buffer, len, packet_buffer);
358+
encode_rsp_packet(packet_data, packet_data_len, packet_buffer);
354359

355-
rv = osd_gdbserver_write_data(ctx, packet_buffer, len + 4);
360+
rv = osd_gdbserver_write_data(ctx, packet_buffer, packet_data_len + 4);
356361
if (OSD_FAILED(rv)) {
357362
return OSD_ERROR_FAILURE;
358363
}

tests/unit/check_gdbserver.c

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,34 +30,60 @@ const unsigned int target_subnet_addr = 0;
3030
unsigned int mock_hostmod_diaddr;
3131
unsigned int mock_scm_diaddr;
3232

33-
START_TEST(test_validate_rsp_packet)
33+
START_TEST(test1_validate_rsp_packet)
3434
{
35-
osd_result rv;
36-
char packet_buffer[12] = "swbreak#ef";
37-
char *buf_p = "swbreak#ef";
3835
bool ver_checksum;
39-
int len;
40-
char buffer[1024];
36+
char *packet_buffer = "swbreak#ef";
37+
int packet_len = 10;
38+
char packet_data[1024];
39+
int packet_data_len;
40+
ver_checksum = validate_rsp_packet(packet_buffer, packet_len,
41+
&packet_data_len, packet_data);
42+
ck_assert_uint_eq(ver_checksum, 1);
43+
ck_assert_uint_eq(packet_data_len, 7);
44+
ck_assert_str_eq(packet_data, "swbreak");
45+
}
46+
END_TEST
4147

42-
rv = validate_rsp_packet(buf_p, &ver_checksum, &len, buffer);
43-
ck_assert(OSD_SUCCEEDED(rv));
44-
ck_assert_uint_eq(len, 7);
45-
ck_assert_str_eq(buffer, "swbreak");
48+
START_TEST(test2_validate_rsp_packet)
49+
{
50+
bool ver_checksum;
51+
char *packet_buffer = "swbre}]ak#c9";
52+
int packet_len = 11;
53+
char packet_data[1024];
54+
int packet_data_len;
55+
ver_checksum = validate_rsp_packet(packet_buffer, packet_len,
56+
&packet_data_len, packet_data);
57+
ck_assert_uint_eq(ver_checksum, 1);
58+
ck_assert_uint_eq(packet_data_len, 8);
59+
ck_assert_str_eq(packet_data, "swbre}ak");
4660
}
4761
END_TEST
4862

49-
START_TEST(test_configure_rsp_packet)
63+
START_TEST(test1_encode_rsp_packet)
5064
{
51-
char buffer[8] = "swbreak";
65+
char packet_data[8] = "swbreak";
5266
int packet_checksum;
53-
int len = 7;
54-
char packet_buffer[len + 5];
67+
int packet_data_len = 7;
68+
char packet_buffer[packet_data_len + 5];
5569

56-
configure_rsp_packet(buffer, len, packet_buffer);
70+
encode_rsp_packet(packet_data, packet_data_len, packet_buffer);
5771
ck_assert_str_eq(packet_buffer, "$swbreak#ef");
5872
}
5973
END_TEST
6074

75+
START_TEST(test2_encode_rsp_packet)
76+
{
77+
char packet_data[9] = "swbre:ak";
78+
int packet_checksum;
79+
int packet_data_len = 8;
80+
char packet_buffer[packet_data_len + 5];
81+
82+
encode_rsp_packet(packet_data, packet_data_len, packet_buffer);
83+
ck_assert_str_eq(packet_buffer, "$swbre:ak#29");
84+
}
85+
END_TEST
86+
6187
Suite *suite(void)
6288
{
6389
Suite *s;
@@ -67,8 +93,10 @@ Suite *suite(void)
6793

6894
tc_testing = tcase_create("Testing");
6995

70-
tcase_add_test(tc_testing, test_validate_rsp_packet);
71-
tcase_add_test(tc_testing, test_configure_rsp_packet);
96+
tcase_add_test(tc_testing, test1_validate_rsp_packet);
97+
tcase_add_test(tc_testing, test2_validate_rsp_packet);
98+
tcase_add_test(tc_testing, test1_encode_rsp_packet);
99+
tcase_add_test(tc_testing, test2_encode_rsp_packet);
72100
suite_add_tcase(s, tc_testing);
73101

74102
return s;

0 commit comments

Comments
 (0)