[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