summaryrefslogtreecommitdiff
path: root/sys/src/9/ip/gre.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-06-08 00:19:33 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-06-08 00:19:33 +0200
commitbe3a5a6dc372870c9c6cb3b039228fab89db07b5 (patch)
tree5db24a811edae74d7f071ec694a3e8ad20c1caf2 /sys/src/9/ip/gre.c
parent9ee3095553844b91e92f69efb44335c850f05c65 (diff)
kernel: remove Block refcounting (thanks erik)
Diffstat (limited to 'sys/src/9/ip/gre.c')
-rw-r--r--sys/src/9/ip/gre.c44
1 files changed, 8 insertions, 36 deletions
diff --git a/sys/src/9/ip/gre.c b/sys/src/9/ip/gre.c
index b7982dc33..dd7ce5b96 100644
--- a/sys/src/9/ip/gre.c
+++ b/sys/src/9/ip/gre.c
@@ -65,7 +65,7 @@ struct GREhdr{
typedef struct GREpriv GREpriv;
struct GREpriv{
/* non-MIB stats */
- ulong lenerr; /* short packet */
+ uvlong lenerr; /* short packet */
};
typedef struct Bring Bring;
@@ -135,8 +135,8 @@ static char *sessend = "session end";
static void grekick(void *x, Block *bp);
static char *gresetup(Conv *, char *, char *, char *);
-ulong grepdin, grepdout, grebdin, grebdout;
-ulong grepuin, grepuout, grebuin, grebuout;
+uvlong grepdin, grepdout, grebdin, grebdout;
+uvlong grepuin, grepuout, grebuin, grebuout;
static Block *
getring(Bring *r)
@@ -437,13 +437,7 @@ restart:
memmove(gre->src, grec->coa, sizeof gre->dst);
memmove(gre->dst, grec->south, sizeof gre->dst);
- /*
- * Make sure the packet does not go away.
- */
- _xinc(&bp->ref);
- assert(bp->ref == 2);
-
- ipoput4(c->p->f, bp, 0, gre->ttl - 1, gre->tos, nil);
+ ipoput4(c->p->f, copyblock(bp, BLEN(bp)), 0, gre->ttl - 1, gre->tos, nil);
grepdout++;
grebdout += BLEN(bp);
@@ -673,7 +667,7 @@ grestats(Proto *gre, char *buf, int len)
gpriv = gre->priv;
return snprint(buf, len,
- "gre: %lud %lud %lud %lud %lud %lud %lud %lud, lenerrs %lud\n",
+ "gre: %llud %llud %llud %llud %llud %llud %llud %llud, lenerrs %llud\n",
grepdin, grepdout, grepuin, grepuout,
grebdin, grebdout, grebuin, grebuout, gpriv->lenerr);
}
@@ -800,13 +794,7 @@ grectldlresume(Conv *c, int, char **)
gre = (GREhdr *)bp->rp;
qunlock(&grec->lock);
- /*
- * Make sure the packet does not go away.
- */
- _xinc(&bp->ref);
- assert(bp->ref == 2);
-
- ipoput4(c->p->f, bp, 0, gre->ttl - 1, gre->tos, nil);
+ ipoput4(c->p->f, copyblock(bp, BLEN(bp)), 0, gre->ttl - 1, gre->tos, nil);
qlock(&grec->lock);
addring(&grec->dlpending, bp);
@@ -841,8 +829,7 @@ grectlulresume(Conv *c, int, char **)
static char *
grectlforward(Conv *c, int, char **argv)
{
- int len;
- Block *bp, *nbp;
+ Block *bp;
GREconv *grec;
GREhdr *gre;
Metablock *m;
@@ -866,22 +853,7 @@ grectlforward(Conv *c, int, char **argv)
m = (Metablock *)bp->base;
assert(m->rp >= bp->base && m->rp < bp->lim);
- /*
- * If the packet is still held inside the IP transmit
- * system, make a copy of the packet first.
- */
- if(bp->ref > 1){
- len = bp->wp - m->rp;
- nbp = allocb(len);
- memmove(nbp->wp, m->rp, len);
- nbp->wp += len;
- freeb(bp);
- bp = nbp;
- }
- else{
- /* Patch up rp */
- bp->rp = m->rp;
- }
+ bp->rp = m->rp;
gre = (GREhdr *)bp->rp;
memmove(gre->src, grec->coa, sizeof gre->dst);