/* Only for direct mode */
{CONF_VAR_IPV4, "visibleipv4", {.ipv4 = {0}}},
{CONF_VAR_STRING, "publicif", {.str = L""}},
+ /* Diffserv should be supported on IPv4, too, but I don't know the
+ * API to do that. */
+ {CONF_VAR_INT, "diffserv-mincost", {.num = 0}},
+ {CONF_VAR_INT, "diffserv-maxrel", {.num = 0}},
+ {CONF_VAR_INT, "diffserv-maxtp", {.num = 0}},
+ {CONF_VAR_INT, "diffserv-mindelay", {.num = 0}},
{CONF_VAR_END}
};
}
}
+void sockpushdata(struct socket *sk, void *buf, size_t size)
+{
+ switch(sk->type)
+ {
+ case SOCK_STREAM:
+ sizebuf(&sk->inbuf.s.buf, &sk->inbuf.s.bufsize, sk->inbuf.s.datasize + size, 1, 1);
+ memmove(sk->inbuf.s.buf + size, sk->inbuf.s.buf, sk->inbuf.s.datasize);
+ memcpy(sk->inbuf.s.buf, buf, size);
+ sk->inbuf.s.datasize += size;
+ break;
+ case SOCK_DGRAM:
+ /* XXX */
+ break;
+ }
+ return;
+}
+
void *sockgetinbuf(struct socket *sk, size_t *size)
{
void *buf;
struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
{
struct socket *sk;
+ int intbuf;
/* I don't know if this is actually correct (it probably isn't),
* but since, at on least Linux systems, PF_* are specifically
int socksettos(struct socket *sk, int tos)
{
+ int buf;
+
if(sk->family == AF_INET)
{
- if(setsockopt(sk->fd, SOL_IP, IP_TOS, &tos, sizeof(tos)) < 0)
+ switch(tos)
+ {
+ case 0:
+ buf = 0;
+ break;
+ case SOCK_TOS_MINCOST:
+ buf = 0x02;
+ break;
+ case SOCK_TOS_MAXREL:
+ buf = 0x04;
+ break;
+ case SOCK_TOS_MAXTP:
+ buf = 0x08;
+ break;
+ case SOCK_TOS_MINDELAY:
+ buf = 0x10;
+ break;
+ default:
+ flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
+ return(-1);
+ }
+ if(setsockopt(sk->fd, SOL_IP, IP_TOS, &buf, sizeof(buf)) < 0)
{
flog(LOG_WARNING, "could not set sock TOS to %i: %s", tos, strerror(errno));
return(-1);
}
return(0);
}
- /* XXX: How does the IPv6 traffic class work? */
+ if(sk->family == AF_INET6)
+ {
+ switch(tos)
+ {
+ case 0:
+ buf = 0;
+ case SOCK_TOS_MINCOST:
+ buf = confgetint("net", "diffserv-mincost");
+ break;
+ case SOCK_TOS_MAXREL:
+ buf = confgetint("net", "diffserv-maxrel");
+ break;
+ case SOCK_TOS_MAXTP:
+ buf = confgetint("net", "diffserv-maxtp");
+ break;
+ case SOCK_TOS_MINDELAY:
+ buf = confgetint("net", "diffserv-mindelay");
+ break;
+ default:
+ flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
+ return(-1);
+ }
+ /*
+ On Linux, the API IPv6 flow label management doesn't seem to
+ be entirely complete, so I guess this will have to wait.
+
+ if(setsockopt(...) < 0)
+ {
+ flog(LOG_WARNING, "could not set sock traffic class to %i: %s", tos, strerror(errno));
+ return(-1);
+ }
+ */
+ return(0);
+ }
flog(LOG_WARNING, "could not set TOS on sock of family %i", sk->family);
return(1);
}