Skip to content

Commit 84281cf

Browse files
committed
API: adding multi-segment sgas
1 parent 0108153 commit 84281cf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+878
-627
lines changed

examples/c/tcp-ping-pong.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static void pop_wait(int qd, demi_qresult_t *qr)
138138

139139
/* Parse operation result. */
140140
assert(qr->qr_opcode == DEMI_OPC_POP);
141-
assert(qr->qr_value.sga.sga_segs != 0);
141+
assert(qr->qr_value.sga.segments != 0);
142142
}
143143

144144
/*====================================================================================================================*
@@ -189,7 +189,7 @@ static void server(int argc, char *const argv[], struct sockaddr_in *local, size
189189
/* Extract received scatter-gather array. */
190190
memcpy(&sga, &qr.qr_value.sga, sizeof(demi_sgarray_t));
191191

192-
nbytes += sga.sga_segs[0].sgaseg_len;
192+
nbytes += sga.segments[0].data_len_bytes;
193193

194194
/* Push scatter-gather array. */
195195
push_wait(qd, &sga, &qr);
@@ -242,10 +242,10 @@ static void client(int argc, char *const argv[], const struct sockaddr_in *remot
242242

243243
/* Allocate scatter-gather array. */
244244
sga = demi_sgaalloc(data_size);
245-
assert(sga.sga_segs != 0);
245+
assert(sga.segments != 0);
246246

247247
/* Prepare data. */
248-
memset(sga.sga_segs[0].sgaseg_buf, 1, data_size);
248+
memset(sga.segments[0].data_buf_ptr, 1, data_size);
249249

250250
/* Push scatter-gather array. */
251251
push_wait(sockqd, &sga, &qr);
@@ -258,9 +258,9 @@ static void client(int argc, char *const argv[], const struct sockaddr_in *remot
258258
pop_wait(sockqd, &qr);
259259

260260
/* Check payload. */
261-
for (uint32_t i = 0; i < qr.qr_value.sga.sga_segs[0].sgaseg_len; i++)
262-
assert(((char *)qr.qr_value.sga.sga_segs[0].sgaseg_buf)[i] == 1);
263-
nbytes += qr.qr_value.sga.sga_segs[0].sgaseg_len;
261+
for (uint32_t i = 0; i < qr.qr_value.sga.segments[0].data_len_bytes; i++)
262+
assert(((char *)qr.qr_value.sga.segments[0].data_buf_ptr)[i] == 1);
263+
nbytes += qr.qr_value.sga.segments[0].data_len_bytes;
264264

265265
/* Release received scatter-gather array. */
266266
assert(demi_sgafree(&qr.qr_value.sga) == 0);

examples/c/tcp-push-pop.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ static int pop_get_received_nbytes(int sockqd)
5252
assert(demi_pop(&tok, sockqd) == 0);
5353
assert(demi_wait(&res, tok, NULL) == 0);
5454
assert(res.qr_opcode == DEMI_OPC_POP);
55-
assert(res.qr_value.sga.sga_segs != 0);
56-
recv_bytes = res.qr_value.sga.sga_segs[0].sgaseg_len;
55+
assert(res.qr_value.sga.segments != 0);
56+
recv_bytes = res.qr_value.sga.segments[0].data_len_bytes;
5757
assert(demi_sgafree(&res.qr_value.sga) == 0);
5858
return recv_bytes;
5959
}
@@ -91,14 +91,14 @@ static int push_get_sent_nbytes(const int sockqd, size_t data_size)
9191
demi_sgarray_t sga = demi_sgaalloc(data_size);
9292
int sent_bytes = 0;
9393

94-
assert(sga.sga_segs != 0);
95-
memset(sga.sga_segs[0].sgaseg_buf, 1, data_size);
94+
assert(sga.segments != 0);
95+
memset(sga.segments[0].data_buf_ptr, 1, data_size);
9696
// ToDo: demi_pushto() also must work for TCP on all LibOSes.
9797
// FIXME: https://github.com/microsoft/demikernel/issues/137
9898
assert(demi_push(&tok, sockqd, &sga) == 0);
9999
assert(demi_wait(&res, tok, NULL) == 0);
100100
assert(res.qr_opcode == DEMI_OPC_PUSH);
101-
sent_bytes = sga.sga_segs[0].sgaseg_len;
101+
sent_bytes = sga.segments[0].data_len_bytes;
102102
assert(demi_sgafree(&sga) == 0);
103103
return sent_bytes;
104104
}
@@ -161,9 +161,12 @@ int main(int argc, char *const argv[])
161161
};
162162
assert(demi_init(&args) == 0);
163163

164-
if (!strcmp(argv[1], "--server")) {
164+
if (!strcmp(argv[1], "--server"))
165+
{
165166
run_server(&addr, data_size, max_msgs);
166-
} else if (!strcmp(argv[1], "--client")) {
167+
}
168+
else if (!strcmp(argv[1], "--client"))
169+
{
167170
run_client(&addr, data_size, max_msgs);
168171
}
169172

examples/c/udp-ping-pong.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ static void pop_wait(int qd, demi_qresult_t *qr)
8686

8787
/* Parse operation result. */
8888
assert(qr->qr_opcode == DEMI_OPC_POP);
89-
assert(qr->qr_value.sga.sga_segs != 0);
89+
assert(qr->qr_value.sga.segments != 0);
9090
}
9191

9292
/*====================================================================================================================*
@@ -195,11 +195,11 @@ static void client(int argc,
195195

196196
/* Allocate scatter-gather array. */
197197
sga = demi_sgaalloc(data_size);
198-
assert(sga.sga_segs != 0);
198+
assert(sga.segments != 0);
199199

200200
/* Prepare data. */
201201
memset(expected_buf, it % 256, data_size);
202-
memcpy(sga.sga_segs[0].sgaseg_buf, expected_buf, data_size);
202+
memcpy(sga.segments[0].data_buf_ptr, expected_buf, data_size);
203203

204204
/* Push scatter-gather array. */
205205
pushto_wait(sockqd, &sga, &qr, (const struct sockaddr *)remote);
@@ -211,7 +211,7 @@ static void client(int argc,
211211
pop_wait(sockqd, &qr);
212212

213213
/* Parse operation result. */
214-
assert(!memcmp(qr.qr_value.sga.sga_segs[0].sgaseg_buf, expected_buf, data_size));
214+
assert(!memcmp(qr.qr_value.sga.segments[0].data_buf_ptr, expected_buf, data_size));
215215

216216
/* Release received scatter-gather array. */
217217
assert(demi_sgafree(&qr.qr_value.sga) == 0);

examples/c/udp-push-pop.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ static void server(int argc,
9595

9696
/* Parse operation result. */
9797
assert(qr.qr_opcode == DEMI_OPC_POP);
98-
assert(qr.qr_value.sga.sga_segs != 0);
99-
assert(!memcmp(qr.qr_value.sga.sga_segs[0].sgaseg_buf, expected_buf, data_size));
98+
assert(qr.qr_value.sga.segments != 0);
99+
assert(!memcmp(qr.qr_value.sga.segments[0].data_buf_ptr, expected_buf, data_size));
100100

101101
/* Release scatter-gather array. */
102102
assert(demi_sgafree(&qr.qr_value.sga) == 0);
@@ -149,10 +149,10 @@ static void client(int argc,
149149

150150
/* Allocate scatter-gather array. */
151151
sga = demi_sgaalloc(data_size);
152-
assert(sga.sga_segs != 0);
152+
assert(sga.segments != 0);
153153

154154
/* Prepare data. */
155-
memset(sga.sga_segs[0].sgaseg_buf, 1, data_size);
155+
memset(sga.segments[0].data_buf_ptr, 1, data_size);
156156

157157
/* Push data. */
158158
assert(demi_pushto(&qt, sockqd, &sga, (const struct sockaddr *)remote, sizeof(struct sockaddr_in)) == 0);

examples/rust/tcp-dump.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ impl Application {
176176
let sockqd: QDesc = qr.qr_qd.into();
177177
let sga: demi_sgarray_t = unsafe { qr.qr_value.sga };
178178

179-
num_bytes += sga.sga_segs[0].sgaseg_len as usize;
179+
num_bytes += sga.segments[0].data_len_bytes as usize;
180180

181181
if let Err(e) = self.libos.sgafree(sga) {
182182
println!("ERROR: sgafree() failed (error={:?})", e);

examples/rust/tcp-ping-pong.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ fn mksga(libos: &mut LibOS, size: usize, value: u8) -> Result<demi_sgarray_t> {
3939
};
4040

4141
// Ensure that allocated the array has the requested size.
42-
if sga.sga_segs[0].sgaseg_len as usize != size {
42+
if sga.segments[0].data_len_bytes as usize != size {
4343
freesga(libos, sga);
44-
let seglen: usize = sga.sga_segs[0].sgaseg_len as usize;
44+
let seglen: usize = sga.segments[0].data_len_bytes as usize;
4545
anyhow::bail!(
4646
"failed to allocate scatter-gather array: expected size={:?} allocated size={:?}",
4747
size,
@@ -50,8 +50,8 @@ fn mksga(libos: &mut LibOS, size: usize, value: u8) -> Result<demi_sgarray_t> {
5050
}
5151

5252
// Fill in the array.
53-
let ptr: *mut u8 = sga.sga_segs[0].sgaseg_buf as *mut u8;
54-
let len: usize = sga.sga_segs[0].sgaseg_len as usize;
53+
let ptr: *mut u8 = sga.segments[0].data_buf_ptr as *mut u8;
54+
let len: usize = sga.segments[0].data_len_bytes as usize;
5555
let slice: &mut [u8] = unsafe { slice::from_raw_parts_mut(ptr, len) };
5656
let mut fill: u8 = value;
5757
for x in slice {
@@ -124,8 +124,8 @@ fn pop_and_wait(libos: &mut LibOS, sockqd: QDesc, recvbuf: &mut [u8]) -> Result<
124124
};
125125

126126
// Copy data.
127-
let ptr: *mut u8 = sga.sga_segs[0].sgaseg_buf as *mut u8;
128-
let len: usize = sga.sga_segs[0].sgaseg_len as usize;
127+
let ptr: *mut u8 = sga.segments[0].data_buf_ptr as *mut u8;
128+
let len: usize = sga.segments[0].data_len_bytes as usize;
129129
let slice: &mut [u8] = unsafe { slice::from_raw_parts_mut(ptr, len) };
130130
for x in slice {
131131
recvbuf[index] = *x;

examples/rust/tcp-pktgen.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ impl Application {
239239
},
240240
};
241241

242-
num_bytes += sga.sga_segs[0].sgaseg_len as usize;
242+
num_bytes += sga.segments[0].data_len_bytes as usize;
243243
if let Err(e) = self.libos.sgafree(sga) {
244244
println!("ERROR: sgafree() failed (error={:?})", e);
245245
println!("WARN: leaking sga");
@@ -257,12 +257,12 @@ impl Application {
257257
};
258258

259259
// Ensure that allocated array has the requested size.
260-
if sga.sga_segs[0].sgaseg_len as usize != size {
260+
if sga.segments[0].data_len_bytes as usize != size {
261261
if let Err(e) = self.libos.sgafree(sga) {
262262
println!("ERROR: sgafree() failed (error={:?})", e);
263263
println!("WARN: leaking sga");
264264
}
265-
let seglen: usize = sga.sga_segs[0].sgaseg_len as usize;
265+
let seglen: usize = sga.segments[0].data_len_bytes as usize;
266266
anyhow::bail!(
267267
"failed to allocate scatter-gather array: expected size={:?} allocated size={:?}",
268268
size,
@@ -271,8 +271,8 @@ impl Application {
271271
}
272272

273273
// Fill in the array.
274-
let ptr: *mut u8 = sga.sga_segs[0].sgaseg_buf as *mut u8;
275-
let len: usize = sga.sga_segs[0].sgaseg_len as usize;
274+
let ptr: *mut u8 = sga.segments[0].data_buf_ptr as *mut u8;
275+
let len: usize = sga.segments[0].data_len_bytes as usize;
276276
let slice: &mut [u8] = unsafe { slice::from_raw_parts_mut(ptr, len) };
277277
slice.fill(value);
278278

examples/rust/tcp-push-pop.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ fn mksga(libos: &mut LibOS, value: u8) -> Result<demi_sgarray_t> {
4040
};
4141

4242
// Create pointer for filling the array.
43-
let ptr: *mut u8 = sga.sga_segs[0].sgaseg_buf as *mut u8;
43+
let ptr: *mut u8 = sga.segments[0].data_buf_ptr as *mut u8;
4444
// Ensure that allocated array has the requested size.
45-
if sga.sga_segs[0].sgaseg_len as usize != BUF_SIZE_BYTES || ptr.is_null() {
45+
if sga.segments[0].data_len_bytes as usize != BUF_SIZE_BYTES || ptr.is_null() {
4646
freesga(libos, sga);
47-
let seglen: usize = sga.sga_segs[0].sgaseg_len as usize;
47+
let seglen: usize = sga.segments[0].data_len_bytes as usize;
4848
anyhow::bail!(
4949
"failed to allocate scatter-gather array: expected size={:?} allocated size={:?}",
5050
BUF_SIZE_BYTES,
@@ -119,8 +119,8 @@ impl TcpServer {
119119
};
120120

121121
// Sanity check received data.
122-
let ptr: *mut u8 = sga.sga_segs[0].sgaseg_buf as *mut u8;
123-
let bytes: usize = sga.sga_segs[0].sgaseg_len as usize;
122+
let ptr: *mut u8 = sga.segments[0].data_buf_ptr as *mut u8;
123+
let bytes: usize = sga.segments[0].data_len_bytes as usize;
124124
debug_assert_eq!(bytes, BUF_SIZE_BYTES);
125125
debug_assert!(ptr.is_aligned());
126126
debug_assert_eq!(ptr.is_null(), false);

examples/rust/udp-dump.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ impl Application {
122122
match self.libos.wait(qt, None) {
123123
Ok(qr) if qr.qr_opcode == demi_opcode_t::DEMI_OPC_POP => {
124124
let sga: demi_sgarray_t = unsafe { qr.qr_value.sga };
125-
num_bytes += sga.sga_segs[0].sgaseg_len as usize;
125+
num_bytes += sga.segments[0].data_len_bytes as usize;
126126
if let Err(e) = self.libos.sgafree(sga) {
127127
println!("ERROR: sgafree() failed (error={:?})", e);
128128
println!("WARN: leaking sga");

examples/rust/udp-echo.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,18 +148,19 @@ impl Application {
148148
demi_opcode_t::DEMI_OPC_POP => {
149149
let sockqd: QDesc = qr.qr_qd.into();
150150
let sga: demi_sgarray_t = unsafe { qr.qr_value.sga };
151-
let saddr: SocketAddr = match Self::sockaddr_to_socketaddrv4(&unsafe { qr.qr_value.sga.sga_addr }) {
152-
Ok(saddr) => SocketAddr::from(saddr),
153-
Err(e) => {
154-
// If error, free scatter-gather array.
155-
if let Err(e) = self.libos.sgafree(sga) {
156-
println!("ERROR: sgafree() failed (error={:?})", e);
157-
println!("WARN: leaking sga");
158-
};
159-
anyhow::bail!("could not parse sockaddr: {}", e)
160-
},
161-
};
162-
num_bytes += sga.sga_segs[0].sgaseg_len as usize;
151+
let saddr: SocketAddr =
152+
match Self::sockaddr_to_socketaddrv4(&unsafe { qr.qr_value.sga.sockaddr_src }) {
153+
Ok(saddr) => SocketAddr::from(saddr),
154+
Err(e) => {
155+
// If error, free scatter-gather array.
156+
if let Err(e) = self.libos.sgafree(sga) {
157+
println!("ERROR: sgafree() failed (error={:?})", e);
158+
println!("WARN: leaking sga");
159+
};
160+
anyhow::bail!("could not parse sockaddr: {}", e)
161+
},
162+
};
163+
num_bytes += sga.segments[0].data_len_bytes as usize;
163164
// Push packet back.
164165
let qt: QToken = match self.libos.pushto(sockqd, &sga, saddr) {
165166
Ok(qt) => qt,

0 commit comments

Comments
 (0)