[ds6-devel]
nc6/src circ_buf.c,1.10,1.11 circ_buf.h,1.9,1.10 readwrite.c,1.18,1.19
chris@deepspace6.net
chris@deepspace6.net
Fri Dec 27 22:58:34 2002
Update of /cvs/nc6/src
Modified Files:
circ_buf.c circ_buf.h readwrite.c
Log Message:
Added an "nbytes" argument to cb_(read|recv) and cb_(write|send). This limits
the amount that is read/written by the call, and will be useful for
implementing MTU's, etc. A value of 0 for nbytes will cause the calls to act
as before and read/write as much as possible.
Index: circ_buf.c
===================================================================
RCS file: /cvs/nc6/src/circ_buf.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- circ_buf.c 27 Dec 2002 15:56:51 -0000 1.10
+++ circ_buf.c 27 Dec 2002 22:58:32 -0000 1.11
@@ -76,36 +76,49 @@
-ssize_t cb_read(circ_buf *cb, int fd)
+ssize_t cb_read(circ_buf *cb, int fd, size_t nbytes)
{
ssize_t rr;
int count;
struct iovec iov[2];
+ size_t len;
cb_assert(cb);
/* buffer is full, return an error condition */
if (cb_is_full(cb)) return -1;
+
+ /* set nbytes appropriately */
+ if (nbytes == 0 || (size_t)nbytes > cb_space(cb))
+ nbytes = cb_space(cb);
/* prepare for writing to buffer */
if (cb->ptr == cb->buf) {
/* space only at end of buf */
iov->iov_base = cb->ptr + cb->data_size;
- iov->iov_len = cb->buf_size - cb->data_size;
+ iov->iov_len = nbytes;
count = 1;
} else if (cb->ptr + cb->data_size >= cb->buf + cb->buf_size) {
/* space only before cb->ptr */
iov->iov_base = cb->ptr + cb->data_size - cb->buf_size;
- iov->iov_len = cb->buf_size - cb->data_size;
+ iov->iov_len = nbytes;
count = 1;
} else {
/* space at end and begining of buf */
iov[0].iov_base = cb->ptr + cb->data_size;
- iov[0].iov_len = (cb->buf_size - cb->data_size)
- - (cb->ptr - cb->buf);
- iov[1].iov_base = cb->buf;
- iov[1].iov_len = cb->ptr - cb->buf;
- count = 2;
+ len = (cb->buf_size - cb->data_size) - (cb->ptr - cb->buf);
+
+ if (len >= nbytes) {
+ /* first space provides enough */
+ iov[0].iov_len = nbytes;
+ count = 1;
+ } else {
+ /* need to use both free spaces */
+ iov[0].iov_len = len;
+ iov[1].iov_base = cb->buf;
+ iov[1].iov_len = nbytes - len;
+ count = 2;
+ }
}
/* do the actual read */
@@ -129,39 +142,54 @@
-ssize_t cb_recv(circ_buf *cb, int fd, struct sockaddr *from, size_t *fromlen)
+ssize_t cb_recv(circ_buf *cb, int fd, size_t nbytes,
+ struct sockaddr *from, size_t *fromlen)
{
ssize_t rr;
int count;
struct iovec iov[2];
struct msghdr msg;
+ size_t len;
cb_assert(cb);
/* buffer is full, return an error condition */
if (cb_is_full(cb)) return -1;
+ /* set nbytes appropriately */
+ if (nbytes == 0 || nbytes > cb_space(cb))
+ nbytes = cb_space(cb);
+
/* prepare for writing to buffer */
if (cb->ptr == cb->buf) {
/* space only at end of buf */
iov->iov_base = cb->ptr + cb->data_size;
- iov->iov_len = cb->buf_size - cb->data_size;
+ iov->iov_len = nbytes;
count = 1;
} else if (cb->ptr + cb->data_size >= cb->buf + cb->buf_size) {
/* space only before cb->ptr */
iov->iov_base = cb->ptr + cb->data_size - cb->buf_size;
- iov->iov_len = cb->buf_size - cb->data_size;
[...129 lines suppressed...]
Index: circ_buf.h
===================================================================
RCS file: /cvs/nc6/src/circ_buf.h,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -d -r1.9 -r1.10
--- circ_buf.h 27 Dec 2002 15:56:51 -0000 1.9
+++ circ_buf.h 27 Dec 2002 22:58:32 -0000 1.10
@@ -47,11 +47,13 @@
#define cb_is_empty(CB) (cb_size(CB) == 0)
#define cb_is_full(CB) (cb_space(CB) == 0)
-ssize_t cb_read(circ_buf *cb, int fd);
-ssize_t cb_recv(circ_buf *cb, int fd, struct sockaddr *from, size_t *fromlen);
+ssize_t cb_read(circ_buf *cb, int fd, size_t nbytes);
+ssize_t cb_recv(circ_buf *cb, int fd, size_t nbytes,
+ struct sockaddr *from, size_t *fromlen);
-ssize_t cb_write(circ_buf *cb, int fd);
-ssize_t cb_send(circ_buf *cb, int fd, struct sockaddr *dest, size_t destlen);
+ssize_t cb_write(circ_buf *cb, int fd, size_t nbytes);
+ssize_t cb_send(circ_buf *cb, int fd, size_t nbytes,
+ struct sockaddr *dest, size_t destlen);
ssize_t cb_append(circ_buf *cb, const uint8_t *buf, size_t len);
ssize_t cb_extract(circ_buf *cb, uint8_t *buf, size_t len);
Index: readwrite.c
===================================================================
RCS file: /cvs/nc6/src/readwrite.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- readwrite.c 24 Dec 2002 23:47:24 -0000 1.18
+++ readwrite.c 27 Dec 2002 22:58:32 -0000 1.19
@@ -208,7 +208,7 @@
rr = recv(ios_readfd(ios1),
(void *)tbuf1, TEMP_BUFFER_SIZE, 0);
} else {
- rr = cb_read(&buf1, ios_readfd(ios1));
+ rr = cb_read(&buf1, ios_readfd(ios1), 0);
}
if (rr > 0) {
@@ -267,7 +267,7 @@
assert(cb_is_full(&buf2) == FALSE);
/* something is ready to read on ios2 (local) */
- rr = cb_read(&buf2, ios_readfd(ios2));
+ rr = cb_read(&buf2, ios_readfd(ios2), 0);
if (rr > 0) {
local_rcvd += rr;
@@ -311,9 +311,9 @@
/* ios1 may be written to (remote) */
if (tbuf1)
- rr = cb_send(&buf2, ios_writefd(ios1), NULL, 0);
+ rr = cb_send(&buf2, ios_writefd(ios1),0,NULL,0);
else
- rr = cb_write(&buf2, ios_writefd(ios1));
+ rr = cb_write(&buf2, ios_writefd(ios1), 0);
if (rr > 0) {
net_sent += rr;
@@ -363,7 +363,7 @@
assert(cb_is_empty(&buf1) == FALSE);
/* ios2 may be written to (local) */
- rr = cb_write(&buf1, ios_writefd(ios2));
+ rr = cb_write(&buf1, ios_writefd(ios2), 0);
if (rr > 0) {
local_sent += rr;
More information about the ds6-devel
mailing list