summaryrefslogtreecommitdiff
path: root/fw
diff options
context:
space:
mode:
Diffstat (limited to 'fw')
-rw-r--r--fw/src/ether.c24
-rw-r--r--fw/src/fw.c7
2 files changed, 18 insertions, 13 deletions
diff --git a/fw/src/ether.c b/fw/src/ether.c
index dd20971..d77143a 100644
--- a/fw/src/ether.c
+++ b/fw/src/ether.c
@@ -38,7 +38,6 @@ enum
Arplen = 28,
Eminlen = 60, /* ethernet minimum frame, devether enforces it */
- Maxframe = Ehdrlen + 16*1024,
Arpreq = 1,
Arpreply = 2,
@@ -321,19 +320,21 @@ etherisip(uchar *f, int n)
* its ethernet address yet we ask and drop this one; the sender will
* try again, which is what every other stack does too.
*/
+/*
+ * Build a frame around an IP packet and send it. The frame buffer
+ * belongs to the caller: 64K of it on the stack once overran a proc
+ * stack and corrupted the data segment, and sizing it here instead
+ * only moves the question of how big is big enough away from the one
+ * place - etherout - that knows how much it can read.
+ */
int
-etherwriteip(uchar *p, int n, uchar *mask)
+etherwriteip(uchar *f, int nf, uchar *p, int n, uchar *mask)
{
- /*
- * On a proc stack, which libthread keeps small: 64K here
- * overran it and corrupted the data segment. pktmedium's maxtu
- * is 4096, so this is already generous.
- */
- uchar f[Maxframe], dst[IPaddrlen], hop[IPaddrlen];
+ uchar dst[IPaddrlen], hop[IPaddrlen];
uchar net[IPaddrlen], ournet[IPaddrlen], mac[Eaddrlen];
int type, len;
- if(n < 20 || n > Maxframe - Ehdrlen)
+ if(n < 20 || nf < Eminlen || n + Ehdrlen > nf)
return -1;
switch(p[0] >> 4){
case 4:
@@ -369,10 +370,13 @@ etherwriteip(uchar *p, int n, uchar *mask)
if(!isv4(hop)){
static int said;
- if(!said++)
+ if(!said++){
fprint(2, "fw: cannot resolve %I: "
"IPv6 neighbour discovery is not implemented, "
"so v6 unicast is dropped\n", hop);
+ syslog(0, "fw", "dropping v6 unicast to %I: "
+ "no neighbour discovery", hop);
+ }
return -1;
}
if(etherdebug)
diff --git a/fw/src/fw.c b/fw/src/fw.c
index b7beb9a..4dc6d79 100644
--- a/fw/src/fw.c
+++ b/fw/src/fw.c
@@ -252,7 +252,7 @@ int etheropen(char*, uchar*);
void ethersetaddr(uchar*, uchar*, int);
int etherisarp(uchar*, int);
int etherisip(uchar*, int);
-int etherwriteip(uchar*, int, uchar*);
+int etherwriteip(uchar*, int, uchar*, int, uchar*);
enum { Ehdrlen = 14 };
@@ -1011,13 +1011,14 @@ etherin(void *a)
static void
etherout(void *a)
{
- uchar *buf;
+ uchar *buf, *frame;
Wire *w;
Pkt p;
int n;
w = a;
buf = emalloc(Maxpkt);
+ frame = emalloc(Ehdrlen + Maxpkt); /* not the proc stack */
for(;;){
if((n = read(w->dfd, buf, Maxpkt)) <= 0){
fprint(2, "fw: %s: read the stack: %r\n", w->side);
@@ -1025,7 +1026,7 @@ etherout(void *a)
threadexitsall("stack");
}
if(permitted(buf, n, Vout, &p))
- etherwriteip(buf, n, ethermask);
+ etherwriteip(frame, Ehdrlen + Maxpkt, buf, n, ethermask);
}
}