Skip to content

Commit a9675ca

Browse files
authored
emulation on host: fix UDP seek&peek (#8827)
1 parent cf24024 commit a9675ca

File tree

3 files changed

+17
-30
lines changed

3 files changed

+17
-30
lines changed

tests/host/common/UdpContextSocket.cpp

+5-20
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,14 @@ size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& a
166166
return ccinbufsize += ret;
167167
}
168168

169-
size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf,
170-
size_t& ccinbufsize)
169+
size_t mockUDPPeekBytes(int sock, char* dst, size_t offset, size_t usersize, int timeout_ms,
170+
char* ccinbuf, size_t& ccinbufsize)
171171
{
172172
(void)sock;
173173
(void)timeout_ms;
174-
if (usersize > CCBUFSIZE)
174+
if (offset + usersize > CCBUFSIZE)
175175
fprintf(stderr, MOCK "CCBUFSIZE(%d) should be increased by %zd bytes (-> %zd)\n", CCBUFSIZE,
176-
usersize - CCBUFSIZE, usersize);
176+
offset + usersize - CCBUFSIZE, offset + usersize);
177177

178178
size_t retsize = 0;
179179
if (ccinbufsize)
@@ -183,25 +183,10 @@ size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, ch
183183
if (retsize > ccinbufsize)
184184
retsize = ccinbufsize;
185185
}
186-
memcpy(dst, ccinbuf, retsize);
186+
memcpy(dst, ccinbuf + offset, retsize);
187187
return retsize;
188188
}
189189

190-
void mockUDPSwallow(size_t copied, char* ccinbuf, size_t& ccinbufsize)
191-
{
192-
// poor man buffer
193-
memmove(ccinbuf, ccinbuf + copied, ccinbufsize - copied);
194-
ccinbufsize -= copied;
195-
}
196-
197-
size_t mockUDPRead(int sock, char* dst, size_t size, int timeout_ms, char* ccinbuf,
198-
size_t& ccinbufsize)
199-
{
200-
size_t copied = mockUDPPeekBytes(sock, dst, size, timeout_ms, ccinbuf, ccinbufsize);
201-
mockUDPSwallow(copied, ccinbuf, ccinbufsize);
202-
return copied;
203-
}
204-
205190
size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4,
206191
uint16_t port)
207192
{

tests/host/common/include/UdpContext.h

+10-5
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,12 @@ class UdpContext
117117

118118
size_t getSize()
119119
{
120-
return _inbufsize;
120+
return _inbufsize - _inoffset;
121121
}
122122

123123
size_t tell() const
124124
{
125-
return 0;
125+
return _inoffset;
126126
}
127127

128128
void seek(const size_t pos)
@@ -132,7 +132,7 @@ class UdpContext
132132
mockverbose("UDPContext::seek too far (%zd >= %zd)\n", pos, _inbufsize);
133133
exit(EXIT_FAILURE);
134134
}
135-
mockUDPSwallow(pos, _inbuf, _inbufsize);
135+
_inoffset = pos;
136136
}
137137

138138
bool isValidOffset(const size_t pos) const
@@ -165,6 +165,7 @@ class UdpContext
165165
bool next()
166166
{
167167
_inbufsize = 0;
168+
_inoffset = 0;
168169
mockUDPFillInBuf(_sock, _inbuf, _inbufsize, addrsize, addr, _dstport);
169170
if (_inbufsize > 0)
170171
{
@@ -182,13 +183,16 @@ class UdpContext
182183

183184
size_t read(char* dst, size_t size)
184185
{
185-
return mockUDPRead(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize);
186+
//return mockUDPRead(_sock, dst, size, _timeout_ms, _inbuf, _inbufsize);
187+
auto ret = mockUDPPeekBytes(_sock, dst, _inoffset, size, _timeout_ms, _inbuf, _inbufsize);
188+
_inoffset += ret;
189+
return ret;
186190
}
187191

188192
int peek()
189193
{
190194
char c;
191-
return mockUDPPeekBytes(_sock, &c, 1, _timeout_ms, _inbuf, _inbufsize) ?: -1;
195+
return mockUDPPeekBytes(_sock, &c, _inoffset, 1, _timeout_ms, _inbuf, _inbufsize) ?: -1;
192196
}
193197

194198
void flush()
@@ -280,6 +284,7 @@ class UdpContext
280284

281285
char _inbuf[CCBUFSIZE];
282286
size_t _inbufsize = 0;
287+
size_t _inoffset = 0;
283288
char _outbuf[CCBUFSIZE];
284289
size_t _outbufsize = 0;
285290

tests/host/common/mock.h

+2-5
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,10 @@ int mockUDPSocket();
160160
bool mockUDPListen(int sock, uint32_t dstaddr, uint16_t port, uint32_t mcast = 0);
161161
size_t mockUDPFillInBuf(int sock, char* ccinbuf, size_t& ccinbufsize, uint8_t& addrsize,
162162
uint8_t addr[16], uint16_t& port);
163-
size_t mockUDPPeekBytes(int sock, char* dst, size_t usersize, int timeout_ms, char* ccinbuf,
164-
size_t& ccinbufsize);
165-
size_t mockUDPRead(int sock, char* dst, size_t size, int timeout_ms, char* ccinbuf,
166-
size_t& ccinbufsize);
163+
size_t mockUDPPeekBytes(int sock, char* dst, size_t offset, size_t usersize, int timeout_ms,
164+
char* ccinbuf, size_t& ccinbufsize);
167165
size_t mockUDPWrite(int sock, const uint8_t* data, size_t size, int timeout_ms, uint32_t ipv4,
168166
uint16_t port);
169-
void mockUDPSwallow(size_t copied, char* ccinbuf, size_t& ccinbufsize);
170167

171168
class UdpContext;
172169
void register_udp(int sock, UdpContext* udp = nullptr);

0 commit comments

Comments
 (0)