24
24
25
25
#include <nuttx/config.h>
26
26
#include <nuttx/arch.h>
27
+ #include <nuttx/lib/lib.h>
27
28
#include <nuttx/signal.h>
28
29
29
30
#include <inttypes.h>
39
40
****************************************************************************/
40
41
41
42
#define RPMSG_PING_EPT_NAME "rpmsg-ping"
42
- #define RPMSG_PING_SEND 1
43
- #define RPMSG_PING_SEND_CHECK 2
44
- #define RPMSG_PING_SEND_NOACK 3
45
- #define RPMSG_PING_SEND_ACK 4
46
- #define RPMSG_PING_ACK 5
43
+
44
+ #define RPMSG_PING_ACK_MASK 0x00000001
45
+ #define RPMSG_PING_CHECK_MASK 0x00000002
46
+ #define RPMSG_PING_RANDOMLEN_MASK 0x00000004
47
+
48
+ #define RPMSG_PING_CMD_MASK 0x000000f0
49
+ # define RPMSG_PING_CMD_REQ 0x00000000
50
+ # define RPMSG_PING_CMD_RSP 0x00000020
47
51
48
52
/****************************************************************************
49
53
* Private Types
@@ -68,12 +72,22 @@ static int rpmsg_ping_ept_cb(FAR struct rpmsg_endpoint *ept,
68
72
FAR struct rpmsg_ping_msg_s * msg = data ;
69
73
FAR sem_t * sem = (FAR sem_t * )(uintptr_t )msg -> cookie ;
70
74
71
- if (msg -> cmd == RPMSG_PING_SEND )
75
+ /* Handle the ping response */
76
+
77
+ if ((msg -> cmd & RPMSG_PING_CMD_MASK ) == RPMSG_PING_CMD_RSP )
78
+ {
79
+ nxsem_post (sem );
80
+ return 0 ;
81
+ }
82
+
83
+ /* Handle the ping request */
84
+
85
+ if ((msg -> cmd & RPMSG_PING_ACK_MASK ) == 0 )
72
86
{
73
- msg -> cmd = RPMSG_PING_ACK ;
74
- rpmsg_send (ept , msg , len );
87
+ return 0 ;
75
88
}
76
- else if (msg -> cmd == RPMSG_PING_SEND_CHECK )
89
+
90
+ if ((msg -> cmd & RPMSG_PING_CHECK_MASK ) != 0 )
77
91
{
78
92
size_t data_len ;
79
93
size_t i ;
@@ -90,25 +104,24 @@ static int rpmsg_ping_ept_cb(FAR struct rpmsg_endpoint *ept,
90
104
91
105
msg -> data [i ] = 0 ;
92
106
}
93
-
94
- msg -> cmd = RPMSG_PING_ACK ;
95
- rpmsg_send (ept , msg , len );
96
107
}
97
- else if (msg -> cmd == RPMSG_PING_SEND_ACK )
108
+
109
+ if ((msg -> cmd & RPMSG_PING_CMD_MASK ) == RPMSG_PING_CMD_REQ )
98
110
{
99
- msg -> cmd = RPMSG_PING_ACK ;
100
- rpmsg_send (ept , msg , sizeof (* msg ));
111
+ msg -> len = len ;
101
112
}
102
- else if ( msg -> cmd == RPMSG_PING_ACK )
113
+ else
103
114
{
104
- nxsem_post ( sem );
115
+ msg -> len = sizeof ( * msg );
105
116
}
106
117
118
+ msg -> cmd = RPMSG_PING_CMD_RSP ;
119
+ rpmsg_send (ept , msg , msg -> len );
107
120
return 0 ;
108
121
}
109
122
110
123
static int rpmsg_ping_once (FAR struct rpmsg_endpoint * ept , int len ,
111
- int ack , uint32_t * buf_len , char i )
124
+ int cmd , uint32_t * buf_len , char i )
112
125
{
113
126
FAR struct rpmsg_ping_msg_s * msg ;
114
127
int ret ;
@@ -122,36 +135,34 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len,
122
135
len = MAX (len , sizeof (struct rpmsg_ping_msg_s ));
123
136
len = MIN (len , * buf_len );
124
137
125
- memset ( msg , 0 , len ) ;
138
+ msg -> cmd = cmd ;
126
139
127
- if (ack )
140
+ if (( msg -> cmd & RPMSG_PING_RANDOMLEN_MASK ) != 0 )
128
141
{
129
- sem_t sem ;
130
-
131
- if (ack == 1 )
132
- {
133
- msg -> cmd = RPMSG_PING_SEND ;
134
- }
135
- else if (ack == 2 )
136
- {
137
- msg -> cmd = RPMSG_PING_SEND_CHECK ;
138
- }
139
- else
140
- {
141
- msg -> cmd = RPMSG_PING_SEND_ACK ;
142
- }
142
+ msg -> len = nrand (len );
143
+ }
144
+ else
145
+ {
146
+ msg -> len = len ;
147
+ }
143
148
144
- msg -> len = len ;
145
- msg -> cookie = (uintptr_t )& sem ;
149
+ if ((msg -> cmd & RPMSG_PING_CHECK_MASK ) != 0 )
150
+ {
151
+ memset (msg -> data , i , msg -> len - sizeof (struct rpmsg_ping_msg_s ) + 1 );
152
+ }
153
+ else
154
+ {
155
+ memset (msg -> data , 0 , msg -> len );
156
+ }
146
157
147
- if (msg -> cmd == RPMSG_PING_SEND_CHECK )
148
- {
149
- memset (msg -> data , i , len - sizeof (struct rpmsg_ping_msg_s ) + 1 );
150
- }
158
+ if ((msg -> cmd & RPMSG_PING_ACK_MASK ) != 0 )
159
+ {
160
+ sem_t sem ;
151
161
162
+ msg -> cookie = (uintptr_t )& sem ;
152
163
nxsem_init (& sem , 0 , 0 );
153
164
154
- ret = rpmsg_send_nocopy (ept , msg , len );
165
+ ret = rpmsg_send_nocopy (ept , msg , msg -> len );
155
166
if (ret >= 0 )
156
167
{
157
168
nxsem_wait_uninterruptible (& sem );
@@ -161,9 +172,7 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len,
161
172
}
162
173
else
163
174
{
164
- msg -> cmd = RPMSG_PING_SEND_NOACK ;
165
- msg -> len = len ;
166
- ret = rpmsg_send_nocopy (ept , msg , len );
175
+ ret = rpmsg_send_nocopy (ept , msg , msg -> len );
167
176
}
168
177
169
178
if (ret < 0 )
@@ -226,7 +235,7 @@ int rpmsg_ping(FAR struct rpmsg_endpoint *ept,
226
235
{
227
236
clock_t tm = perf_gettime ();
228
237
229
- send_len = rpmsg_ping_once (ept , ping -> len , ping -> ack , & buf_len , i );
238
+ send_len = rpmsg_ping_once (ept , ping -> len , ping -> cmd , & buf_len , i );
230
239
if (send_len < 0 )
231
240
{
232
241
return send_len ;
0 commit comments