/*
* Copyright (c) 1995 Danny Gasparovski.
- *
- * Please read the file COPYRIGHT for the
+ *
+ * Please read the file COPYRIGHT for the
* terms and conditions of the copyright.
*/
#include <slirp.h>
+#include <main-loop.h>
-/* Done as a macro in socket.h */
-/* int
- * sbspace(struct sockbuff *sb)
- * {
- * return SB_DATALEN - sb->sb_cc;
- * }
- */
+static void sbappendsb(struct sbuf *sb, struct mbuf *m);
void
-sbfree(sb)
- struct sbuf *sb;
+sbfree(struct sbuf *sb)
{
free(sb->sb_data);
}
void
-sbdrop(sb, num)
- struct sbuf *sb;
- int num;
+sbdrop(struct sbuf *sb, int num)
{
- /*
+ int limit = sb->sb_datalen / 2;
+
+ /*
* We can only drop how much we have
- * This should never succeed
+ * This should never succeed
*/
if(num > sb->sb_cc)
num = sb->sb_cc;
sb->sb_rptr += num;
if(sb->sb_rptr >= sb->sb_data + sb->sb_datalen)
sb->sb_rptr -= sb->sb_datalen;
-
+
+ if (sb->sb_cc < limit && sb->sb_cc + num >= limit) {
+ qemu_notify_event();
+ }
}
void
-sbreserve(sb, size)
- struct sbuf *sb;
- int size;
+sbreserve(struct sbuf *sb, int size)
{
if (sb->sb_data) {
/* Already alloced, realloc if necessary */
* (the socket is non-blocking, so we won't hang)
*/
void
-sbappend(so, m)
- struct socket *so;
- struct mbuf *m;
+sbappend(struct socket *so, struct mbuf *m)
{
int ret = 0;
-
+
DEBUG_CALL("sbappend");
DEBUG_ARG("so = %lx", (long)so);
DEBUG_ARG("m = %lx", (long)m);
DEBUG_ARG("m->m_len = %d", m->m_len);
-
+
/* Shouldn't happen, but... e.g. foreign host closes connection */
if (m->m_len <= 0) {
m_free(m);
return;
}
-
+
/*
* If there is urgent data, call sosendoob
* if not all was sent, sowrite will take care of the rest
sosendoob(so);
return;
}
-
+
/*
* We only write if there's nothing in the buffer,
* ottherwise it'll arrive out of order, and hence corrupt
*/
if (!so->so_rcv.sb_cc)
- ret = write(so->s, m->m_data, m->m_len);
-
+ ret = slirp_send(so, m->m_data, m->m_len, 0);
+
if (ret <= 0) {
- /*
+ /*
* Nothing was written
* It's possible that the socket has closed, but
* we don't need to check because if it has closed,
* Copy the data from m into sb
* The caller is responsible to make sure there's enough room
*/
-void
-sbappendsb(sb, m)
- struct sbuf *sb;
- struct mbuf *m;
+static void
+sbappendsb(struct sbuf *sb, struct mbuf *m)
{
int len, n, nn;
-
+
len = m->m_len;
if (sb->sb_wptr < sb->sb_rptr) {
* done in sbdrop when the data is acked
*/
void
-sbcopy(sb, off, len, to)
- struct sbuf *sb;
- int off;
- int len;
- char *to;
+sbcopy(struct sbuf *sb, int off, int len, char *to)
{
char *from;
-
+
from = sb->sb_rptr + off;
if (from >= sb->sb_data + sb->sb_datalen)
from -= sb->sb_datalen;
memcpy(to+off,sb->sb_data,len);
}
}
-